제출 #1123072

#제출 시각아이디문제언어결과실행 시간메모리
1123072ezzzayFountain (eJOI20_fountain)C++20
100 / 100
469 ms28012 KiB
#include<bits/stdc++.h> using namespace std; #define ff first #define ss second #define pb push_back const int N=3e5+5; int a[N]; bool vis[N]; int d[N],c[N]; vector<int>ans ; vector<int>v[N]; int par[30][N]; int dst[N]; void dfs(int a){ dst[a]+=c[a]; for(auto b:v[a]){ dst[b]+=dst[a]; dfs(b); } } signed main(){ int n,q; cin>>n>>q; for(int i=1;i<=n;i++){ cin>>d[i]>>c[i]; } c[n+1]=1e9; stack<pair<int,int>> st; st.push({int(1e9), int(n+1)}) ; for(int i=n;i>=1;i--){ while (!st.empty() && st.top().first <= d[i]) st.pop(); int p=st.top().ss; v[p].pb(i); par[0][i]=p; st.push({d[i], i}); } par[0][n+1]=n+1; for(int i=1;i<22;i++){ for(int j=1;j<=n;j++){ par[i][j]=par[i-1][par[i-1][j]]; } } dfs(n+1); while(q--){ int x,v; cin>>x>>v; for(int i=20;i>=0;i--){ int p=par[i][x]; if(dst[x]-dst[p]<v){ v-=dst[x]-dst[p]; x=p; } } if(x==n+1)x=0; ans.pb(x); } for(auto a:ans)cout<<a<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...