Submission #65406


ソースコード

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
117
118
119
120
121
122
123
124
125
126
127
#include <bits/stdc++.h>
using namespace std;
struct segment{
int N,inf=30000,minf=-30000;
vector<int> minv,maxv,sumv;
segment(int n){
N=1;
while(N<n){
N*=2;
}
minv.resize(N*2);
maxv.resize(N*2);
sumv.resize(N*2);
for(int i=0;i<N*2;i++){
minv[i]=0;
maxv[i]=0;
sumv[i]=0;
}
}
void out(int n){
for(int i=N-1;i<n+N;i++){
cout<<maxv[i]<<" ";
}
cout<<"\n";
}
void update(int i,int x){
i+=N-1;
minv[i]=x;
maxv[i]=x;
sumv[i]=x;
while(i>0){
i=(i-1)/2;
minv[i]=min(minv[i*2+1],minv[i*2+2]);
maxv[i]=max(maxv[i*2+1],maxv[i*2+2]);
sumv[i]=sumv[i*2+1]+sumv[i*2+2];
}
}
void add(int i,int x){
i+=N-1;
minv[i]+=x;
maxv[i]+=x;
sumv[i]+=x;
while(i>0){
i=(i-1)/2;
minv[i]=min(minv[i*2+1],minv[i*2+2]);
maxv[i]=max(maxv[i*2+1],maxv[i*2+2]);
sumv[i]=sumv[i*2+1]+sumv[i*2+2];
}
}
int getmin(int a,int b,int k,int l,int r){
if(r<=a||b<=l){
return inf;
}
if(a<=l&&r<=b){
return minv[k];
}
int c1=getmin(a,b,k*2+1,l,(l+r)/2),c2=getmin(a,b,k*2+2,(l+r)/2,r);
return min(c1,c2);
}
int getMin(int a,int b){
return getmin(a,b,0,0,N);
}
int getmax(int a,int b,int k,int l,int r){
if(r<=a||b<=l){
return minf;
}
if(a<=l&&r<=b){
return maxv[k];
}
int c1=getmax(a,b,k*2+1,l,(l+r)/2),c2=getmax(a,b,k*2+2,(l+r)/2,r);
return max(c1,c2);
}
int getMax(int a,int b){
return getmax(a,b,0,0,N);
}
int getsum(int a,int b,int k,int l,int r){
if(r<=a||b<=l){
return 0;
}
if(a<=l&&r<=b){
return sumv[k];
}
int c1=getsum(a,b,k*2+1,l,(l+r)/2),c2=getsum(a,b,k*2+2,(l+r)/2,r);
return c1+c2;
}
int getSum(int a,int b){
return getsum(a,b,0,0,N);
}
};
signed main(){
cin.tie(nullptr);
ios_base::sync_with_stdio(false);
int n,m;
cin>>n>>m;
segment seg(n);
for(int i=0;i<m;i++){
string query;
cin>>query;
if(query=="update"){
int pos,value;
cin>>pos>>value;
seg.update(pos,value);
}
if(query=="add"){
int pos,value;
cin>>pos>>value;
seg.add(pos,value);
}
if(query=="getMin"){
int begin,end;
cin>>begin>>end;
cout<<seg.getMin(begin,end)<<'\n';
}
if(query=="getMax"){
int begin,end;
cin>>begin>>end;
cout<<seg.getMax(begin,end)<<'\n';
}
if(query=="getSum"){
int begin,end;
cin>>begin>>end;
cout<<seg.getSum(begin,end)<<'\n';
}
}
// seg.out(n);
return 0;
}

ステータス

項目 データ
問題 1072 - セグメントツリー技術基礎
ユーザー名 ei2009
投稿日時 2021-01-27 16:36:45
言語 C++17
状態 Accepted
得点 1
ソースコード長 3206 Byte
最大実行時間 67 ms
最大メモリ使用量 9236 KB

セット

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

テストケース

ファイル名 状態 実行時間 メモリ使用量 #
in01 AC 17 ms 604 KB
1
in02 AC 42 ms 944 KB
1
in03 AC 40 ms 4124 KB
1
in04 AC 51 ms 4312 KB
1
in05 AC 22 ms 4244 KB
1
in06 AC 37 ms 2776 KB
1
in07 AC 40 ms 2968 KB
1
in08 AC 59 ms 2524 KB
1
in09 AC 47 ms 5020 KB
1
in10 AC 57 ms 3808 KB
1
in11 AC 26 ms 2972 KB
1
in12 AC 34 ms 2400 KB
1
in13 AC 51 ms 5580 KB
1
in14 AC 64 ms 3720 KB
1
in15 AC 39 ms 6220 KB
1
in16 AC 50 ms 3728 KB
1
in17 AC 48 ms 6608 KB
1
in18 AC 32 ms 6804 KB
1
in19 AC 47 ms 6992 KB
1
in20 AC 34 ms 7060 KB
1
in21 AC 38 ms 5588 KB
1
in22 AC 55 ms 5904 KB
1
in23 AC 46 ms 7632 KB
1
in24 AC 45 ms 6292 KB
1
in25 AC 52 ms 5844 KB
1
in26 AC 67 ms 8472 KB
1
in27 AC 50 ms 8532 KB
1
in28 AC 64 ms 7316 KB
1
in29 AC 37 ms 9044 KB
1
in30 AC 59 ms 9236 KB
1
in31 AC 39 ms 7892 KB
1
in32 AC 55 ms 8088 KB
1