Submission #1267774

#TimeUsernameProblemLanguageResultExecution timeMemory
1267774enzyRailway Trip 2 (JOI22_ho_t4)C++20
100 / 100
1337 ms55836 KiB
//#pragma GCC optimize("O3,unrool-loops")
//#pragma GCC target("avx2")
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+1;
const int inf=1e6+7;
const int maxk=18;
int esq[maxn][maxk], dir[maxn][maxk], aux_seg[4*maxn][maxk][2];
pair<int,int> seg[4*maxn][2];

void refresh(int id, int ini, int fim, int oq){
    if(ini!=fim){
        int e=2*id, d=2*id+1;
        if(!oq){
            seg[e][oq].second=min(seg[e][oq].second,seg[id][oq].second);
            seg[d][oq].second=min(seg[d][oq].second,seg[id][oq].second);
        }else{
            seg[e][oq].second=max(seg[e][oq].second,seg[id][oq].second);
            seg[d][oq].second=max(seg[d][oq].second,seg[id][oq].second);
        }
    }
    if(!oq){
        seg[id][oq].first=min(seg[id][oq].first,seg[id][oq].second);
        seg[id][oq].second=inf;
    }else{
        seg[id][oq].first=max(seg[id][oq].first,seg[id][oq].second);
        seg[id][oq].second=0;
    }
}

void build(int id, int ini, int fim){
    if(ini==fim){
        seg[id][0].first=seg[id][1].first=ini;
        seg[id][0].second=inf;
        return;
    }
    int mid=(ini+fim)/2, e=2*id, d=2*id+1;
    build(e,ini,mid); build(d,mid+1,fim);
    seg[id][0]=min(seg[e][0],seg[d][0]);
    seg[id][1]=max(seg[e][1],seg[d][1]);
}

void update(int id, int ini, int fim, int l, int r, int val, int oq){
    refresh(id,ini,fim,oq);
    if(ini>r||fim<l) return;
    if(l<=ini&&fim<=r){
        if(!oq) seg[id][oq].second=min(seg[id][oq].second,val);
        else seg[id][oq].second=max(seg[id][oq].second,val);
        refresh(id,ini,fim,oq);
        return;
    }
    int mid=(ini+fim)/2, e=2*id, d=2*id+1;
    update(e,ini,mid,l,r,val,oq); update(d,mid+1,fim,l,r,val,oq);
    if(!oq) seg[id][oq].first=min(seg[e][oq].first,seg[d][oq].first);
    else seg[id][oq].first=max(seg[e][oq].first,seg[d][oq].first);
}



int query(int id, int ini, int fim, int l, int r, int oq){
    refresh(id,ini,fim,oq);
    if(ini>r||fim<l){
        if(!oq) return inf;
        else return 0;
    }
    if(l<=ini&&fim<=r) return seg[id][oq].first;
    int mid=(ini+fim)/2, e=2*id, d=2*id+1;
    if(!oq) return min(query(e,ini,mid,l,r,oq),query(d,mid+1,fim,l,r,oq));
    return max(query(e,ini,mid,l,r,oq),query(d,mid+1,fim,l,r,oq));
}

void aux_build(int id, int ini, int fim, int b){
    if(ini==fim){
        aux_seg[id][b][0]=esq[ini][b];
        aux_seg[id][b][1]=dir[ini][b];
        return;
    }
    int mid=(ini+fim)/2, e=2*id, d=2*id+1;
    aux_build(e,ini,mid,b); aux_build(d,mid+1,fim,b);
    aux_seg[id][b][0]=min(aux_seg[e][b][0],aux_seg[d][b][0]);
    aux_seg[id][b][1]=max(aux_seg[e][b][1],aux_seg[d][b][1]);
}

int aux_query(int id, int ini, int fim, int l, int r, int b, int oq){
    if(ini>r||fim<l){
        if(!oq) return inf;
        else return 0;
    }
    if(l<=ini&&fim<=r) return aux_seg[id][b][oq];
    int mid=(ini+fim)/2, e=2*id, d=2*id+1;
    if(!oq) return min(aux_query(e,ini,mid,l,r,b,oq),aux_query(d,mid+1,fim,l,r,b,oq));
    return max(aux_query(e,ini,mid,l,r,b,oq),aux_query(d,mid+1,fim,l,r,b,oq));
}

int main(){
    ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    int n, k, m; cin >> n >> k >> m;
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int a, b; cin >> a >> b;
        if(a<b) update(1,1,n,a,min(a+k-1,b),b,1);
        else{
            swap(a,b);
            update(1,1,n,max(b-k+1,a),b,a,0);
        }
    }
    for(int i=1;i<=n;i++){
        esq[i][0]=query(1,1,n,i,i,0);
        dir[i][0]=query(1,1,n,i,i,1);
    }
    aux_build(1,1,n,0);
    /*for(int i=1;i<=n;i++) cout << esq[i][0] << " ";
    cout << endl;
    for(int i=1;i<=n;i++) cout << dir[i][0] << " ";
    cout << endl;
    for(int i=1;i<=n;i++) cout << aux_query(1,1,n,i,i,0,0) << " ";
    cout << endl;
    for(int i=1;i<=n;i++) cout << aux_query(1,1,n,i,i,0,1) << " ";
    cout << endl;*/
    for(int b=1;b<maxk;b++){
        for(int i=1;i<=n;i++){
            int l=esq[i][b-1], r=dir[i][b-1];
            esq[i][b]=aux_query(1,1,n,l,r,b-1,0);
            dir[i][b]=aux_query(1,1,n,l,r,b-1,1);
        }
        aux_build(1,1,n,b);
    }
    int q; cin >> q;
    while(q--){
        int s, t; cin >> s >> t;
        int resp=0, l=s, r=s;
        if(esq[s][maxk-1]>t||dir[s][maxk-1]<t) cout << -1 << endl;
        else{
            for(int b=maxk-1;b>=0;b--){
                int nl=aux_query(1,1,n,l,r,b,0), nr=aux_query(1,1,n,l,r,b,1);
                if(nl>t||nr<t){
                    l=nl; r=nr;
                    resp+=(1<<b);
                }
            }
            cout << resp+1 << endl;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...