Submission #562582

#TimeUsernameProblemLanguageResultExecution timeMemory
562582illyakrFountain (eJOI20_fountain)C++14
100 / 100
454 ms64204 KiB
//#pragma GCC optimize("inline,Ofast,no-stack-protector,unroll-loops,fast-math,O3")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,popcnt,avx,abm")
#include <bits/stdc++.h>
#define ll long long
#define int ll
typedef long double ld;
#define fast ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define y0 dfgoert
#define y1 kjsjofd
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int mod = 1000000007;
const int INF1e9 = 1010101010;
const int INF1e18 = 1010101010101010101;
const ld PI =  3.14159265358979323846264338327950288419716939937510;

int n, q;
int d[101010], c[101010];
int t[401010];
void build(int v, int vl, int vr) {
    if (vl == vr) {
        t[v] = vl;
        return;
    }
    int vm = (vl + vr) / 2;
    build(2 * v, vl, vm);
    build(2 * v + 1, vm + 1, vr);
    if (d[t[2 * v]] > d[t[2 * v + 1]])
        t[v] = t[2 * v];
    else
        t[v] = t[2 * v + 1];
}

int gt(int v, int vl, int vr, int l, int r, int cur) {
    if (d[t[v]] <= cur)return INF1e9;
    if (vl == vr)return t[v];

    int vm = (vl + vr) / 2;
    if (l <= vl && vr <= r) {
        if (cur < d[t[2 * v]])return gt(2 * v, vl, vm, l, r, cur);
        return gt(2 * v + 1, vm + 1, vr, l, r, cur);
    }
    if (r < vl || vr < l)return INF1e9;
    return min(gt(2 * v, vl, vm, l, r, cur), gt(2 * v + 1, vm + 1, vr, l, r, cur));
}
vector<pair<int, int> > g[101010];
int rmq[30][101010];
int can[30][101010];
int to[101010];

int tin[101010];
int tout[101010];
int T = 1;
void dfs(int v) {
    if (tin[v] != 0)return;
    tin[v] = T++;
//    cout << v << " --> " << to[v] << endl;
    if (to[v] == 0) {
        for (int i = 0; i < 30; i++) {
            rmq[i][v] = v;
            can[i][v] = INF1e9;
        }
        return;
    }
    dfs(to[v]);
    tout[v] = T++;

    rmq[0][v] = to[v];
    can[0][v] = c[v];

    for (int i = 1; i < 30; i++) {
        rmq[i][v] = rmq[i - 1][rmq[i - 1][v]];
        can[i][v] = can[i - 1][v] + can[i - 1][rmq[i - 1][v]];
    }
}

int uplf(int v, int li) {
//    cout << v << " " << li << " !!" << endl;
    for (int i = 29; i >= 0; i--) {
//        cout << i << ": " << can[i][v] << "   " << rmq[i][v] << "      ??? " << li << endl;
        if (li > can[i][v]) {
            li -= can[i][v];
            v = rmq[i][v];
            continue;
        }
    }
    return v;
}

void solve() {
    cin >> n >> q;
    for (int i = 1; i <= n; i++)
        cin >> d[i] >> c[i];
    d[n + 1] = INF1e18;c[n + 1] = INF1e18;
    n++;

    build(1, 1, n);
    for (int i = n - 1; i >= 1; i--) {
        to[i] = gt(1, 1, n, i + 1, n, d[i]);
    }
    dfs(1);
    for (int i = 1; i <= n; i++) {
        if (tin[i] == 0)
            dfs(i);
    }
    while (q--) {
        int R, V;
        cin >> R >> V;
        int ans = uplf(R, V);
        if (ans == n)cout << 0 << '\n';
        else cout << ans << '\n';
    }
//    for (int i = 1; i <= n; i++) {
//        for (int j = 0; j < 5; j++) {
//            cout << setw(2) << rmq[j][i];
//            cout << setw(5) << can[j][i];
//            cout << "        ";
//        }
//        cout << endl;
//    }
}

int32_t main() {
    fast
    int t = 1;
//    cin >> t;
    for (int id = 1; id <= t; id++) {
//        cout << "Case " << id << ": ";
        solve();
    }
}
/**
10 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10


6 5
4 10
6 8
3 5
4 14
10 9
4 20
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...