제출 #1225695

#제출 시각아이디문제언어결과실행 시간메모리
1225695MuhammadSaramSum Zero (RMI20_sumzero)C++20
61 / 100
374 ms36012 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long

const int M = 4e5+5, lg = 19;

int nxt[M][3],ans[M],a[M];
map<ll,vector<int>> ind;

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(NULL), cout.tie(NULL);
	
	int n;
	cin>>n;
	ll su=0;
	ind[su].push_back(0);
	for (int i=1;i<=n;i++)
		cin>>a[i],su+=a[i],ind[su].push_back(i);
	for (auto [i,v]:ind)
		reverse(ind[i].begin(),ind[i].end()),ind[i].shrink_to_fit();
	set<int> se={n+1};
	for (auto [x,v]:ind)
		if (v.size()>1)
			se.insert(v[v.size()-2]);
	su=0;
	for (int i=1;i<=n+1;su+=a[i],i++)
	{
		nxt[i][2]=*se.begin();
		ind[su].pop_back();
		int m=ind[su].size();
		if (m)
			se.erase(ind[su].back());
		if (m>1)
			se.insert(ind[su][m-2]);
	}
	ind.clear(),se.clear();
	nxt[n+2][2]=n+1;
	int q;
	cin>>q;
	int l[q],r[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...