Submission #1275185

#TimeUsernameProblemLanguageResultExecution timeMemory
1275185warrennFountain (eJOI20_fountain)C++20
100 / 100
427 ms29928 KiB
#include<bits/stdc++.h> using namespace std; #define int long long const int maxn=1e5; int n,qu,d[maxn+2],c[maxn+2],val[maxn+2],par[maxn+2];; vector<int>adj[maxn+2]; int bin[maxn+2][20]; void dfs(int cur,int tot,int p){ par[cur]=p; val[cur]=tot; for(auto x : adj[cur]){ dfs(x,tot+c[x],cur); } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin>>n>>qu; for(int q=1;q<=n;q++){ cin>>d[q]>>c[q]; } d[n+1]=1e18; c[n+1]=0; stack<int>st; st.push(n+1); for(int q=n;q>=1;q--){ while(st.size() && d[st.top()]<=d[q]){ st.pop(); } adj[st.top()].push_back(q); st.push(q); } dfs(n+1,0,0); for(int q=1;q<=n;q++){ bin[q][0]=par[q]; } for(int q=1;q<20;q++){ for(int w=1;w<=n;w++){ bin[w][q]=bin[bin[w][q-1]][q-1]; } } while(qu--){ int r,v; cin>>r>>v; if(val[r]<v){ cout<<0<<endl; continue; } if(c[r]>=v){ cout<<r<<endl; continue; } int cur=r; for(int q=19;q>=0;q--){ if(val[r]-val[bin[bin[cur][q]][0]]<v){ cur=bin[cur][q]; } } cur=par[cur]; if(cur==n+1)cur=0; cout<<cur<<endl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...