Submission #884948

#TimeUsernameProblemLanguageResultExecution timeMemory
884948vjudge1Fountain (eJOI20_fountain)C++17
100 / 100
253 ms58832 KiB
#include <bits/stdc++.h>
using namespace std;

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> indexed_set;

#define endl '\n'
#define ll long long
#define int ll
#define pii pair <int, int>
#define pb push_back
#define all(v) v.begin(), v.end()
#define F first
#define S second
#define io ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define M_PI 3.14159265358979323846

const int N = 2e5 + 5;
const int mod = 1e9 + 7;
const int INF = 1e18;

int n, q, x, y;
int a[N], b[N], sm[N][20], par[N][20];
vector<int> v[N];

void DFS(int node){
    for(int i = 1; i < 20; i++){
        par[node][i] = par[par[node][i - 1]][i - 1];
        sm[node][i] = sm[node][i - 1] + sm[par[node][i - 1]][i - 1];
    }
    for(int i : v[node]){
        par[i][0] = node;
        sm[i][0] = b[i];
        DFS(i);
    }
}

signed main() {
    io;
    cin >> n >> q;
    for(int i = 1; i <= n; i++){
        cin >> a[i] >> b[i];
    }
    stack<pii> s;
    s.push({INF, 0});
    for(int i = n; i > 0; i--){
        while(!s.empty() && s.top().first <= a[i]){
            s.pop();
        }
        int cur = s.top().second;
        v[cur].pb(i);
        s.push({a[i], i});
    }
    DFS(0);
    while(q--){
        cin >> x >> y;
        for(int i = 19; i >= 0; i--){
            if(sm[x][i] < y){
              //  cout << x << " " << y << " ----- " << sm[x][i] << "  ";
                y -= sm[x][i];
                x = par[x][i];

            }
        }
        cout << x << endl;
    }
}
/*
1 2 3 4 5 6     7
4 6 3 4 10 4    INF

5
8
9
12
16


0
101110
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...