Submission #798679

#TimeUsernameProblemLanguageResultExecution timeMemory
798679gg123_peStreet Lamps (APIO19_street_lamps)C++14
60 / 100
1199 ms167660 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define f(i,a,b) for(int i = a; i < b; i++) const int N = 3e5 + 5, M = 1000; const int RA = 1e6 + 5; int n, q; ll a[M][M]; void subtask_1(){ f(i,1,q+1){ f(j,1,n+1) a[i][j] = a[i-1][j]; string ty; ll x, y; cin >> ty; if(ty[0] == 'q'){ cin >> x >> y; // cuantos tiempos el rango [x, y-1] suma 0 int ans = 0; f(j,0,i){ int sum = 0; f(r,x,y) sum += a[j][r]; if(sum == 0) ans++; } cout << ans << "\n"; } else{ cin >> x; a[i][x] = 1 - a[i][x]; } } } ll A[RA], root[RA]; vector <ll> L, R, st; ll ti[RA], X[RA], Y[RA]; int createLeaf(int val){ L.push_back(-1), R.push_back(-1); st.push_back(val); return L.size() - 1; } int createNode(int u, int v){ L.push_back(u), R.push_back(v); st.push_back(st[u] + st[v]); return L.size() - 1; } int build(int l, int r){ if(l == r) return createLeaf(A[l]); int m = (l+r)>>1; return createNode(build(l, m), build(m+1, r)); } int upd(int id, int l, int r, int pos, int val){ if(l == r) return createLeaf(val); int m = (l+r)>>1; if(pos <= m) return createNode(upd(L[id], l, m, pos, val), R[id]); return createNode(L[id], upd(R[id], m+1, r, pos, val)); } int Query(int id, int l, int r, int x, int y){ if(r < x or y < l) return 0; if(x <= l and r <= y) return st[id]; int m = (l+r)>>1; return Query(L[id], l, m, x, y) + Query(R[id], m+1, r, x, y); } void subtask_3(){ root[0] = build(1, n); f(i,1,q+1){ root[i] = root[i-1]; if(ti[i] == 0){ ll x = X[i], y = Y[i]; y--; int ans = 0; if(Query(root[i-1], 1, n, x, y) == 0){ int l = 0, r = i-1; while(l < r){ int m = (l+r)>>1; if(Query(root[m], 1, n, x, y) == 0) r = m; else l = m+1; } ans = i - l; } cout << ans << "\n"; } else{ int x = X[i]; root[i] = upd(root[i], 1, n, x, 0); } } } ll curr[RA]; ll start[RA]; void subtask_2(){ f(i,1,q+1){ int x = X[i]; if(ti[i] == 0){ ll tot = curr[x]; if(A[x] == 0){ tot += (i - start[x]); } cout << tot << "\n"; } else{ if(A[x] == 0){ curr[x] += i - start[x]; } else{ start[x] = i; } A[x] = 1 - A[x]; } } } int main(){ cin >> n >> q; string s; cin >> s; f(i,0,n){ if(s[i] == '0') a[0][i+1] = A[i+1] = 1; else a[0][i+1] = A[i+1] = 0; } if(n <= 100 and q <= 100){ subtask_1(); return 0; } bool flag = true; f(i,1,q+1){ string sa; cin >> sa; if(sa[0] == 'q'){ cin >> X[i] >> Y[i]; if(Y[i] != X[i] + 1) flag = false; } else{ ti[i] = 1; cin >> X[i]; } } if(flag) { subtask_2(); return 0; } subtask_3(); return 0; }
#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...