이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+50;
int n;
int q;
int koliko[N];
int staje[N];
int up[N][21];
int suf[N];
stack<int>s;
int P[N];
int kti(int n,int k){
    for(int i=0;i<=20;i++){
        if(k&(1ll<<i))n=up[n][i];
    }
    return n;
}
signed main(){
    cin>>n>>q;
    for(int i=1;i<=n;i++)cin>>koliko[i]>>staje[i];
    for(int i=0;i<=n;i++)P[i]=0;
    for(int i=n;i>=1;i--){
        while(s.size()&&koliko[s.top()]<=koliko[i])s.pop();
        if(s.size())P[i]=s.top();
        s.push(i);
    }
    for(int i=0;i<=n;i++)suf[i]=0;
    for(int i=1;i<=n;i++)if(!P[i])suf[i]=staje[i];
    for(int i=n;i>=1;i--){
        if(P[i])suf[i]=suf[P[i]]+staje[i];
    }
    for(int i=0;i<=n;i++)for(int j=0;j<=20;j++)up[i][j]=0;
    for(int i=1;i<=n;i++){
        up[i][0]=P[i];
    }
    for(int i=1;i<=20;i++){
        for(int j=1;j<=n;j++){
            up[j][i]=up[up[j][i-1]][i-1];
        }
    }
    while(q--){
        int q,k;
        cin>>q>>k;
        if(suf[q]<k){
            cout<<0;
            cout<<endl;
            continue;
        }
        int l=0,r=n;int R=-1;
        while(l<=r){
            int mid=(l+r)/2;
            int X=kti(q,mid);
            int y=P[X];
            if(suf[q]-suf[y]<k)l=mid+1;
            else {
                r=mid-1;
                R=mid;
            }
        }
        cout<<kti(q,R);
        cout<<endl;
    }
}
/*
6 5
4 10
6 8
3 5
4 14
10 9
4 20
1 25
6 30
5 8
3 13
2 8
*/
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |