제출 #1225688

#제출 시각아이디문제언어결과실행 시간메모리
1225688MuhammadSaramSum Zero (RMI20_sumzero)C++20
61 / 100
346 ms39348 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int M = 4e5+5, lg = 19; int nxt[M][3],a[M],l[M],r[M],ans[M]; ll pre[M]; map<ll,vector<int>> ind; int main() { ios::sync_with_stdio(0); cin.tie(NULL), cout.tie(NULL); int n; cin>>n; for (int i=1;i<=n;i++) cin>>a[i],pre[i]=pre[i-1]+a[i]; for (int i=n;i>=0;i--) ind[pre[i]].push_back(i); set<int> se={n+1}; for (auto [x,v]:ind) if (v.size()>1) se.insert(v[v.size()-2]); for (int i=1;i<=n+1;i++) { nxt[i][2]=*se.begin(); ind[pre[i-1]].pop_back(); int m=ind[pre[i-1]].size(); if (m) se.erase(ind[pre[i-1]].back()); if (m>1) se.insert(ind[pre[i-1]][m-2]); } nxt[n+2][2]=n+1; int q; cin>>q; for (int i=0;i<q;i++) cin>>l[i]>>r[i]; for (int lim=lg-1;lim>=0;lim--) { for (int i=1;i<=n+2;i++) nxt[i][0]=nxt[i][2]; for (int p=1;p<=lim;p++) for (int i=1;i<=n+2;i++) nxt[i][p%2]=nxt[nxt[i][1-p%2]+1][1-p%2]; for (int i=0;i<q;i++) if (nxt[l[i]][lim%2]<=r[i]) ans[i]+=(1<<lim),l[i]=nxt[l[i]][lim%2]+1; } for (int i=0;i<q;i++) cout<<ans[i]<<'\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...