Submission #163982

#TimeUsernameProblemLanguageResultExecution timeMemory
163982Leonardo_PaesStreet Lamps (APIO19_street_lamps)C++17
60 / 100
1138 ms35092 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 3e5+10; int n, q; string initial; vector<int> toggles; vector<int> events[maxn]; string query[maxn]; int aa[maxn], bb[maxn]; bool subtask_1(){ return n<=100 and q<=100; } bool subtask_2(){ bool ok = true; for(int i=1; i<=q; i++){ if(query[i][0]=='q' and bb[i]-aa[i]!=1) ok = false; } return ok; } int tree[4*maxn]; void build(int node, int l, int r){ if(l==r){ if((int)(initial[l]-'0') == 1) tree[node] = 0; else tree[node] = 0x3f3f3f3f; return; } int mid = (l+r) >> 1; build(2*node, l, mid); build(2*node+1, mid+1, r); tree[node] = max(tree[2*node], tree[2*node+1]); } void update(int node, int l, int r, int pos, int val){ if(l==r){ tree[node] = val; return; } int mid = (l+r) >> 1; if(pos<=mid) update(2*node, l, mid, pos, val); else update(2*node+1, mid+1, r, pos, val); tree[node] = max(tree[2*node], tree[2*node+1]); } int queryy(int node, int tl, int tr, int l, int r){ if(tl > r or tr < l) return 0; if(tl >= l and tr <= r) return tree[node]; int mid = (tl+tr) >> 1; return max(queryy(2*node, tl, mid, l, r), queryy(2*node+1, mid+1, tr, l, r)); } int main(){ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); cin >> n >> q; initial.resize(n+2); for(int i=1; i<=n; i++){ cin >> initial[i]; if(initial[i]=='1') events[i].push_back(0); } for(int i=1; i<=q; i++){ cin >> query[i]; if(query[i][0] == 'q') cin >> aa[i] >> bb[i]; else cin >> aa[i]; } if(subtask_1()){ toggles.push_back(0); for(int t=1; t<=q; t++){ string op = query[t]; if(op[0] == 'q'){ int a = aa[t], b = bb[t]; string now = initial; int ans = 0; for(int i=0; i<toggles.size(); i++){ if(now[toggles[i]]=='0') now[toggles[i]] = '1'; else now[toggles[i]] = '0'; bool ok = true; for(int j=a; j<b; j++) if(now[j] == '0') ok = false; if(ok) ans++; } cout << ans << endl; toggles.push_back(0); } else{ int i = aa[t]; toggles.push_back(i); } } } else if(subtask_2()){ for(int t=1; t<=q; t++){ string op = query[t]; if(op[0] == 'q'){ int a = aa[t], b = bb[t]; int ans = 0; for(int i=0; i<events[a].size(); i++){ if(i%2){ ans += events[a][i] - events[a][i-1]; } } if(events[a].size()%2) ans += t - events[a].back(); cout << ans << endl; } else{ int i = aa[t]; events[i].push_back(t); } } } else{ build(1, 1, n); for(int t=1; t<=q; t++){ string op = query[t]; if(op[0] == 'q'){ int a = aa[t], b = bb[t]; int ans = queryy(1, 1, n, a, b-1); if(ans == 0x3f3f3f3f) cout << 0 << endl; else cout << t-ans << endl; } else{ int i = aa[t]; update(1, 1, n, i, t); } } } return 0; }

Compilation message (stderr)

street_lamps.cpp: In function 'int main()':
street_lamps.cpp:104:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 for(int i=0; i<toggles.size(); i++){
                              ~^~~~~~~~~~~~~~~
street_lamps.cpp:135:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 for(int i=0; i<events[a].size(); i++){
                              ~^~~~~~~~~~~~~~~~~
street_lamps.cpp:131:32: warning: unused variable 'b' [-Wunused-variable]
                 int a = aa[t], b = bb[t];
                                ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...