제출 #1197899

#제출 시각아이디문제언어결과실행 시간메모리
1197899mishasimFountain (eJOI20_fountain)C++20
30 / 100
106 ms33648 KiB
#include <bits/stdc++.h> using namespace std; #define endl '\n' long long n,q,val,pos,currd; long long d[100005],v[100005],nextx[100005]; vector<int> vv; stack<int> st; long long upper[100005][20]; long long sum[100005][20]; int main() { ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>q; for(int i = 1 ; i<=n ; i++){ cin>>d[i]>>v[i]; } for(int i = n ; i>=1 ; i--){ while(st.size()>0 && d[st.top()]<d[i]){ st.pop(); } if(st.size()==0)nextx[i] = 0; else nextx[i] = st.top(); st.push(i); } for(int i = 1 ; i<=n ; i++){ upper[i][0] = nextx[i]; sum[i][0] = v[i]; } for(int k = 1 ; k<=18 ; k++){ for(int i = 1 ; i<=n ; i++){ int p = upper[i][k-1]; if(p==0)upper[i][k] = 0; else upper[i][k] = upper[p][k-1]; sum[i][k] = sum[i][k-1]; if(p!=0)sum[i][k]+=sum[p][k-1]; } } while(q--){ cin>>pos>>val; int curr = pos; long long rem = val; for(int k = 18 ; k>=0 ; k--){ if(curr!=0 && upper[curr][k] != 0 && sum[curr][k] < rem){ rem-=sum[curr][k]; curr = upper[curr][k]; } } int answer; if(curr!=0 && v[curr]>=rem){ answer = curr; } else answer = 0; cout<<answer<<endl; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...