Submission #1331084

#TimeUsernameProblemLanguageResultExecution timeMemory
1331084boclobanchatFountain (eJOI20_fountain)C++20
100 / 100
140 ms18808 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
const int INF=1e9;
int nex[MAXN],A[MAXN],W[MAXN],fen[MAXN],val[MAXN],sp[MAXN][20],sum[MAXN][20];
int getlog(long long n) { return 63-__builtin_clzll(n); }
void update(int i,int n,int val) { for(;i<=n;i+=i&-i) fen[i]=min(fen[i],val); }
int get(int i) { int ans=INF;for(;i;i-=i&-i) ans=min(ans,fen[i]);return ans; }
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,q;
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
    	cin>>A[i]>>W[i];
    	val[i]=A[i];
	}
	sort(val+1,val+n+1);
	for(int i=1;i<=n;i++) fen[i]=INF;
    for(int i=n;i;i--)
    {
    	A[i]=lower_bound(val+1,val+n+1,A[i])-val;
    	sp[i][0]=get(n-A[i]),sum[i][0]=W[i];
		update(n-A[i]+1,n,i);
	}
	for(int j=1;(1<<j)<=n;j++) for(int i=1;i<=n;i++) if(sp[i][j-1]==INF) sp[i][j]=sp[i][j-1],sum[i][j]=sum[i][j-1];
	else sp[i][j]=sp[sp[i][j-1]][j-1],sum[i][j]=sum[i][j-1]+sum[sp[i][j-1]][j-1];
	while(q--)
	{
		int x,v;
		cin>>x>>v;
		for(int j=getlog(n);j+1;j--)
		{
			if(sum[x][j]<v) v-=sum[x][j],x=sp[x][j];
			if(x==INF) break;
		}
		if(x==INF) cout<<"0\n";
		else cout<<x<<"\n";
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...