Submission #1272633

#TimeUsernameProblemLanguageResultExecution timeMemory
1272633algoproclubSum Zero (RMI20_sumzero)C++20
61 / 100
1012 ms79248 KiB
// UUID: 18f9ee18-a136-49ed-bf86-df7923a0e383
#include <bits/stdc++.h>
using namespace std;

int main() {

	int n, K = 20;
	cin >> n;
	vector<long long> v(n+1), pr(n+1);
	for (int i = 1; i <= n; i++) {
		cin >> v[i];
		pr[i]=pr[i-1]+v[i];
	}
	vector<int> par(n+1, -1),  last(n+1);
	last[0]=-1;
	map<long long, int> mep;
	map<long long, bool> mep2;
	mep2[0]=1;
	for (int i = 1; i <= n; i++) {
		if (mep2[pr[i]]) {
			par[i]=mep[pr[i]];
		}
		mep2[pr[i]]=1;
		mep[pr[i]]=i;
		last[i]=max(last[i-1], par[i]);
		//cerr << par[i] << ' ';
	}
	//cerr<<'\n';
	vector<vector<int>> up(n+1, vector<int>(K+1));
	for (int i = 0; i <= K; i++)up[0][i]=-1;
	for (int i = 1; i <= n; i++) {
		up[i][0] = last[i];
		for (int j = 1; j <= K; j++) {
			if (up[i][j-1]==-1)up[i][j]=-1;
			else up[i][j] = up[up[i][j-1]][j-1];
		}
	}
	int q;
	cin >> q;
	while (q--) {
		int l, r;
		cin >> l >> r;
		int ans = 0, ind = r;
		for (int i = K; i >= 0; i--) {
			if (up[ind][i]>=l-1) {
				ans += 1<<i;
				ind = up[ind][i];
			}
		}
		cout << ans << endl;
		//for(int i = 0; i <= K; i++)cerr<<up[r][i]<<' ';
		//cerr<<'\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...