Submission #537903

#TimeUsernameProblemLanguageResultExecution timeMemory
537903vladislav11Sum Zero (RMI20_sumzero)C++14
100 / 100
345 ms20396 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int N = int(4e5)+100; int n; ll a[N]; int nxt[N]; int jmp[N]; array<int,3> qer[N]; int main () { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; a[0] = 0; for ( int i=1; i<=n; i++ ) cin >> a[i]; for ( int i=1; i<=n; i++ ) a[i] += a[i-1]; for ( int i=0; i<=n+1; i++ ) nxt[i] = n+1; multiset<int> mst; mst.insert( 0 ); for ( int l=0, r=0; l<=n; l++ ) { /*cout << l << ": "; for ( auto& el : mst ) cout << el << ' '; cout << '\n';*/ while ( r <= n ) { if ( mst.count( a[r] ) >= 2 ) break; r++; if ( r <= n ) mst.insert( a[r] ); } /*cout << l << ' ' << r << ": "; for ( auto& el : mst ) cout << el << ' '; cout << '\n';*/ nxt[l+1] = r; mst.erase( mst.find( a[l] ) ); } //cout << "here\n"; /*map<ll,int> pre; for ( int i=0; i<=n; i++ ) { if ( pre.count( a[i] ) ) nxt[ pre[a[i]]+1 ] = i; pre[ a[i] ] = i; }*/ /*for ( int i=0; i<=n; i++ ) cout << nxt[i] << ' '; cout << '\n';*/ for ( int i=n; i>=0; i-- ) nxt[i] = min( nxt[i], nxt[i+1] ); int q; cin >> q; for ( int i=0; i<q; i++ ) { cin >> qer[i][0] >> qer[i][1]; qer[i][2] = 0; } for ( int p=20; p>=0; p-- ) { for ( int i=0; i<=n+1; i++ ) jmp[i] = nxt[i]; for ( int i=0; i<p; i++ ) { for ( int j=0; j<=n+1; j++ ) jmp[j] = jmp[ min( n+1, jmp[j]+1 ) ]; } /*cout << p << ": "; for ( int i=0; i<=n+1; i++ ) cout << jmp[i] << ' '; cout << '\n';*/ for ( int i=0; i<q; i++ ) { if ( qer[i][0] <= qer[i][1] && jmp[ qer[i][0] ] <= qer[i][1] ) { qer[i][2] += 1 << p; qer[i][0] = jmp[ qer[i][0] ] + 1; } } } for ( int i=0; i<q; i++ ) cout << qer[i][2] << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...