제출 #642194

#제출 시각아이디문제언어결과실행 시간메모리
642194oscar1fFountain (eJOI20_fountain)C++17
30 / 100
433 ms36796 KiB
#include<bits/stdc++.h>
using namespace std;

#define int long long

const int MAX_RES=100*1000+5,LOG2=18,INFINI=2*1000*1000*1000;
int nbRes,nbReq,taille,pos,rest;
vector<pair<int,int>> diam;
int pere[MAX_RES][LOG2][2];
set<int> proch;
set<int>::iterator it;

signed main() {
    ios_base::sync_with_stdio(false);
    cin>>nbRes>>nbReq;
    for (int i=0;i<nbRes;i++) {
        cin>>taille>>pere[i][0][1];
        diam.push_back(make_pair(taille,i));
    }
    sort(diam.begin(),diam.end());
    proch.insert(nbRes);
    for (int i=nbRes-1;i>=0;i--) {
        it=proch.lower_bound(diam[i].second);
        pere[diam[i].second][0][0]=(*it);
        proch.insert(diam[i].second);
    }
    for (int i=0;i<LOG2;i++) {
        pere[nbRes][i][0]=nbRes;
        pere[nbRes][i][1]=INFINI;
    }
    for (int i=1;i<LOG2;i++) {
        for (int j=0;j<nbRes;j++) {
            pere[j][i][0]=pere[pere[j][i-1][0]][i-1][0];
            pere[j][i][1]=pere[j][i-1][1]+pere[pere[j][i-1][0]][i-1][1];
        }
    }
    for (int i=0;i<nbReq;i++) {
        cin>>pos>>rest;
        pos--;
        for (int j=LOG2-1;j>=0;j--) {
            if (pere[pos][j][1]<rest) {
                rest-=pere[pos][j][1];
                pos=pere[pos][j][0];
                //cout<<j<<" : "<<pos<<" "<<rest<<endl;
            }
        }
        if (pos==nbRes) {
            pos=-1;
        }
        cout<<pos+1<<endl;
    }
    return 0; 
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...