제출 #1009010

#제출 시각아이디문제언어결과실행 시간메모리
1009010AlmontherFountain (eJOI20_fountain)C++98
100 / 100
131 ms45776 KiB
#include <bits/stdc++.h> #define suiii ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define ll long long #define co cout<< // #pragma GCC optimize("O3,Ofast,unroll-loops") // #pragma GCC target("avx2,sse3,sse4,avx") using namespace std; //stuff const ll maxn=1000001; ll n,q; ll arr[maxn],val[maxn]; ll f[maxn][22][2]; ll bigger[maxn]; void make_spars(ll x){ if(x==0){ for(int i=1;i<=n;i++){ f[i][x][0]=val[i]; f[i][x][1]=bigger[i]; } } else{ for(int i=1;i<=n;i++){ f[i][x][0]=f[i][x-1][0]+f[f[i][x-1][1]][x-1][0]; f[i][x][1]=f[f[i][x-1][1]][x-1][1]; } } } void solve(){ cin>>n>>q; vector<ll>v; for(int i=1;i<=n;i++){ cin>>arr[i]>>val[i]; } for(int i=n;i>=1;i--){ while(v.size()&&arr[v.back()]<=arr[i]) v.pop_back(); if(v.size()) bigger[i]=v.back(); else bigger[i]=0; v.push_back(i); } for(int i=0;i<=21;i++) make_spars(i); while(q--){ ll a,b; cin>>a>>b; ll idx=21; while(idx>=0){ if(a==0) break; if(b-f[a][idx][0]>0&&f[a][idx][0]!=0){ b-=f[a][idx][0]; a=f[a][idx][1]; } idx--; } co a<<'\n'; } } int main() { suiii int t=1; // cin>>t; while(t--){ solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...