Submission #643251

#TimeUsernameProblemLanguageResultExecution timeMemory
643251KriptonSum Zero (RMI20_sumzero)C++14
61 / 100
310 ms21816 KiB
#include <bits/stdc++.h> using namespace std; map <long long,int> last; int best[100001][17]; long long s[100001]; int logue[100001]; int main() { int n,x,i,j; cin>>n; best[0][0]=-1; for(i=2;i<=n;i++) logue[i]=logue[i/2]+1; for(i=1;i<=n;i++) { cin>>x; s[i]=s[i-1]+x; best[i][0]=best[i-1][0]; if(s[i]==0||last[s[i]]) best[i][0]=max(last[s[i]],best[i][0]); last[s[i]]=i; } for(j=1;j<=logue[n];j++) for(i=0;i<=n;i++) if(best[i][j-1]!=-1) best[i][j]=best[best[i][j-1]][j-1]; else best[i][j]=-1; int q,a,b; cin>>q; for(i=1;i<=q;i++) { cin>>a>>b; if(best[b][0]==-1) { cout<<"0\n"; continue; } int rez=0; if(s[b]!=s[best[b][0]]) { b=best[b][0]; rez=1; } if(b<a-1) { cout<<"0\n"; continue; } int start=b,pas=logue[n]; while(pas!=-1) { if(best[start][pas]>=a-1) { rez+=(1<<pas); start=best[start][pas]; } pas--; } cout<<rez<<'\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...