제출 #1360580

#제출 시각아이디문제언어결과실행 시간메모리
1360580fatime_aslan_156Fountain (eJOI20_fountain)C++20
100 / 100
326 ms35200 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll M=1e5+5;
vector<ll>d,c;
ll p[20][M][2];
ll get(ll a,ll b)
{
    if(c[a]>=b)
    return a;
    ll r=c[a];
    for(int i=19;i>=0;i--)
    {
        if(p[i][a][1]+r<b)
        {
            r+=p[i][a][1];
            a=p[i][a][0];
        }
    }
    return p[0][a][0];
}
int main()
{
    ll n,q;
    cin>>n>>q;
    d.resize(n+1);
    c.resize(n+1);
    for(int i=1;i<=n;i++)
    {
        cin>>d[i]>>c[i];
    }
    stack<ll>s;
    for(int i=n;i>=1;i--)
    {
        while(!s.empty() && d[s.top()]<=d[i])
        s.pop();
        if(s.empty())
        {
        p[0][i][0]=0;
        p[0][i][1]=0;
        }
        else
        {
        p[0][i][0]=s.top();
        p[0][i][1]=c[s.top()];
        }
        s.push(i);
    }
    for(int i=1;i<20;i++)
    {
        for(int j=1;j<=n;j++)
        {
            p[i][j][0]=p[i-1][p[i-1][j][0]][0];
            p[i][j][1]=p[i-1][p[i-1][j][0]][1]+p[i-1][j][1];
        }
    }
    while(q--)
    {
        ll a,b;
        cin>>a>>b;
        cout<<get(a,b)<<endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...