제출 #1346562

#제출 시각아이디문제언어결과실행 시간메모리
1346562hasanFountain (eJOI20_fountain)C++20
100 / 100
574 ms61092 KiB
#include <bits/stdc++.h>
using namespace std;

#define endl '\n'
#define int int_fast64_t
#define ul uint_fast32_t
#define ll int_fast64_t
#define dll long double
#define ull uint_fast64_t
#define spektar this_thread::sleep_for(chrono::milliseconds(50))

int log2floor(ull n){ return 63-__builtin_clzll(n); }

const int MAX=2e5+5;
//vector<int> seqtree(4*MAX);
//vector<int> lazy(4*MAX);
vector<vector<int>> up(log2floor(MAX)+1,vector<int>(MAX));
vector<vector<int>> sum(log2floor(MAX)+1,vector<int>(MAX));
/*
void build(int v,int l,int r,vector<int>& k){
    if(l==r) seqtree[v]=k[l-1];
    else{
        int m=(l+r)/2;
        build(2*v,l,m,k);
        build(2*v+1,m+1,r,k);
        seqtree[v]=seqtree[2*v]+seqtree[2*v+1];
    }
}

void push(int v,int l,int r){
    seqtree[v]+=lazy[v]*(r-l+1);
    if(l!=r){
        lazy[2*v]+=lazy[v];
        lazy[2*v+1]+=lazy[v];
    }
    lazy[v]=0;
}

void upd(int v,int l,int r,vector<int>& k,int a){
    if(l==r) seqtree[v]=k[l-1];
    else{
        int m=(l+r)/2;
        if(a<=m) upd(2*v,l,m,k,a);
        else upd(2*v+1,m+1,r,k,a);
        seqtree[v]=seqtree[2*v]+seqtree[2*v+1];
    }
}

void upd(int v,int l,int r,vector<int>& k,int l1,int r1,int a){
    if(l>=l1 && r<=r1){
        lazy[v]+=a;
        push(v,l,r);
    }
    else{
        if(lazy[v]>0) push(v,l,r);
        int m=(l+r)/2;
        if(!(l>r1 || m<l1)) upd(2*v,l,m,k,l1,r1,a);
        if(!(m+1>r1 || r<l1)) upd(2*v+1,m+1,r,k,l1,r1,a);
        seqtree[v]=seqtree[2*v]+seqtree[2*v+1];
    }
}

int ask(int v,int l,int r,int l1,int r1){
    if(lazy[v]>0) push(v,l,r);
    if(r<l1 || l>r1) return 0;
    if(l1<=l && r<=r1) return seqtree[v];
    else{
        int m=(l+r)/2;
        return ask(2*v,l,m,l1,r1)+ask(2*v+1,m+1,r,l1,r1);
    }
}
*/
void build_st(int n){
    for(int i=1; i<=log2floor(MAX); i++){
        for(int j=1; j<=n+1; j++){
            if(up[i-1][j]!=0){
                up[i][j]=up[i-1][up[i-1][j]];
                sum[i][j]=sum[i-1][j]+sum[i-1][up[i-1][j]];
            }
            else{
                up[i][j]=0;
                sum[i][j]=sum[i-1][j];
            }
        }
    }
}

array<int,2> binlift(int a,int b){
    int s=0;
    for(int i=log2floor(MAX); i>=0; i--){
        if(b&(1<<i)){
            s+=sum[i][a];
            a=up[i][a];
        }
    }
    return {a,s};
}

void solve(){
    int n,m;
    cin >> n >> m;
    vector<array<int,2>> k(n);
    for(auto& [a,b]:k) cin >> a >> b;
    stack<int> kk;
    for(int i=n-1; i>=0; i--){
        sum[0][i+1]=k[i][1];
        while(kk.size() && k[kk.top()-1][0]<=k[i][0]) kk.pop();
        if(!kk.size()) up[0][i+1]=0;
        else up[0][i+1]=kk.top();
        kk.push(i+1);
    }
    build_st(n);
    for(int i=0; i<m; i++){
        int a,b;
        cin >> a >> b;
        int l=0,r=n,best=0;
        while(l<=r){
            int mid=(l+r)/2;
            array<int,2> c=binlift(a,mid+1);
            if(c[1]>=b){
                r=mid-1;
                best=binlift(a,mid)[0];
            }
            else l=mid+1;
        }
        cout << best << endl;
    }
}

signed main(){
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int t=1;
    //cin >> t;
    while(t--){
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...