Submission #65079


ソースコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include<bits/stdc++.h>
#define lol long long
using namespace std;
struct Segment{
vector<lol> vamin,vamax,vasum;
lol N;
Segment(lol n){
N=1;
while(N<n) N*=2;
vamin.resize(N*2);
vamax.resize(N*2);
vasum.resize(N*2);
for(lol i=0;i<N*2;i++){
vamin[i]=0;
vamax[i]=0;
vasum[i]=0;
}
}
void update(lol i,lol b){
i+=N-1;
vamin[i]=b;
vamax[i]=b;
vasum[i]=b;
while(i>0){
i=(i-1)/2;
vamin[i]=min(vamin[2*i+1],vamin[2*i+2]);
vamax[i]=max(vamax[2*i+1],vamax[2*i+2]);
vasum[i]=vasum[2*i+1]+vasum[2*i+2];
}
}
void out(lol n){
for(lol i=N-1;i<n+N;i++){
cout<<vamin[i]<<" "<<vamax[i]<<" "<<vasum[i]<<"\n";
}
}
void add(lol i,lol b){
i+=N-1;
vamin[i]+=b;
vamax[i]+=b;
vasum[i]+=b;
while(i>0){
i=(i-1)/2;
vamin[i]=min(vamin[2*i+1],vamin[2*i+2]);
vamax[i]=max(vamax[2*i+1],vamax[2*i+2]);
vasum[i]=vasum[2*i+1]+vasum[2*i+2];
}
}
lol quetyMin(lol a,lol b,lol k,lol l,lol r){
//minの場合は範囲外の時、returnで大きい値を返さなければならない
if(r<=a || b<=l) return INT_MAX; //int型の最大値(2の31乗くらい)がでる
if(a<=l && r<=b) return vamin[k];
else{
lol c1=quetyMin(a,b,2*k+1,l,(l+r)/2);
lol c2=quetyMin(a,b,2*k+2,(l+r)/2,r);
return min(c1,c2);
}
}
lol quetyMax(lol a,lol b,lol k,lol l,lol r){
if(r<=a || b<=l) return -INT_MAX;
if(a<=l && r<=b) return vamax[k];
else{
lol c1=quetyMax(a,b,2*k+1,l,(l+r)/2);
lol c2=quetyMax(a,b,2*k+2,(l+r)/2,r);
return max(c1,c2);
}
}
lol quetySum(lol a,lol b,lol k,lol l,lol r){
if(r<=a || b<=l) return 0;
if(a<=l && r<=b) return vasum[k];
else{
lol c1=quetySum(a,b,2*k+1,l,(l+r)/2);
lol c2=quetySum(a,b,2*k+2,(l+r)/2,r);
return (c1+c2);
}
}
lol getMin(lol a,lol b){
return quetyMin(a,b,0,0,N);
}
lol getMax(lol a,lol b){
return quetyMax(a,b,0,0,N);
}
lol getSum(lol a,lol b){
return quetySum(a,b,0,0,N);
}
};
int main(){
cin.tie(nullptr);
ios_base::sync_with_stdio(false);
lol n,m;
cin>>n>>m;
Segment seguki(n);
string s;
lol a,b;
for(lol i=0;i<m;i++){
cin>>s>>a>>b;
if(s=="update"){
seguki.update(a,b);
}else if(s=="add"){
seguki.add(a,b);
}else if(s=="getMin"){
cout<<seguki.getMin(a,b)<<"\n";
}else if(s=="getMax"){
cout<<seguki.getMax(a,b)<<"\n";
}else if(s=="getSum"){
cout<<seguki.getSum(a,b)<<"\n";
}
}
// seguki.out(n);
return(0);
}

ステータス

項目 データ
問題 1072 - セグメントツリー技術基礎
ユーザー名 ei2038
投稿日時 2020-12-21 17:05:04
言語 C++17
状態 Accepted
得点 1
ソースコード長 3116 Byte
最大実行時間 61 ms
最大メモリ使用量 12312 KB

セット

セット 得点 Cases
1 ALL 1 / 1 *

テストケース

ファイル名 状態 実行時間 メモリ使用量 #
in01 AC 26 ms 604 KB
1
in02 AC 39 ms 1068 KB
1
in03 AC 47 ms 7220 KB
1
in04 AC 52 ms 7412 KB
1
in05 AC 29 ms 7344 KB
1
in06 AC 34 ms 4204 KB
1
in07 AC 36 ms 4524 KB
1
in08 AC 52 ms 3180 KB
1
in09 AC 51 ms 7976 KB
1
in10 AC 53 ms 5220 KB
1
in11 AC 25 ms 3748 KB
1
in12 AC 27 ms 2524 KB
1
in13 AC 58 ms 8684 KB
1
in14 AC 61 ms 4396 KB
1
in15 AC 50 ms 9192 KB
1
in16 AC 43 ms 4140 KB
1
in17 AC 57 ms 9580 KB
1
in18 AC 37 ms 9772 KB
1
in19 AC 49 ms 9960 KB
1
in20 AC 43 ms 10024 KB
1
in21 AC 37 ms 7136 KB
1
in22 AC 51 ms 7584 KB
1
in23 AC 41 ms 10592 KB
1
in24 AC 44 ms 7832 KB
1
in25 AC 47 ms 6488 KB
1
in26 AC 52 ms 11412 KB
1
in27 AC 54 ms 11608 KB
1
in28 AC 58 ms 8860 KB
1
in29 AC 34 ms 11996 KB
1
in30 AC 53 ms 12312 KB
1
in31 AC 34 ms 9300 KB
1
in32 AC 46 ms 9492 KB
1