제출 #1267757

#제출 시각아이디문제언어결과실행 시간메모리
1267757enzyRailway Trip 2 (JOI22_ho_t4)C++20
0 / 100
2098 ms103912 KiB
#pragma GCC optimize("O3")
#pragma GCC taeget("avx2")
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const int inf=1e9+7;
const int maxk=18;
int esq[maxn][maxk], dir[maxn][maxk], seg[3*maxn][2], aux_seg[3*maxn][maxk][2], lz[3*maxn][2], aux_lz[3*maxn][maxk][2];

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


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) lz[id][oq]=min(lz[id][oq],val);
        else lz[id][oq]=max(lz[id][oq],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]=min(seg[e][oq],seg[d][oq]);
    else seg[id][oq]=max(seg[e][oq],seg[d][oq]);
}



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];
    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_refresh(int id, int ini, int fim, int b, int oq){
    if(ini!=fim){
        int e=2*id, d=2*id+1;
        if(!oq){
            aux_lz[e][b][oq]=min(aux_lz[e][b][oq],aux_lz[id][b][oq]);
            aux_lz[d][b][oq]=min(aux_lz[d][b][oq],aux_lz[id][b][oq]);
        }else{
            aux_lz[e][b][oq]=max(aux_lz[e][b][oq],aux_lz[id][b][oq]);
            aux_lz[d][b][oq]=max(aux_lz[d][b][oq],aux_lz[id][b][oq]);
        }
    }
    if(!oq){
        aux_seg[id][b][oq]=min(aux_seg[id][b][oq],aux_lz[id][b][oq]);
        aux_lz[id][b][oq]=inf;
    }else{
        aux_seg[id][b][oq]=max(aux_seg[id][b][oq],aux_lz[id][b][oq]);
        aux_lz[id][b][oq]=0;
    }
}

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



int aux_query(int id, int ini, int fim, int l, int r, int b, int oq){
    aux_refresh(id,ini,fim,b,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;
    for(int i=0;i<3*n;i++){
        for(int b=0;b<maxk;b++){
            aux_seg[i][b][0]=aux_lz[i][b][0]=inf;
            aux_seg[i][b][1]=aux_lz[i][b][1]=0;
        }
        seg[i][0]=lz[i][0]=inf;
        seg[i][1]=lz[i][1]=0;
    }
    for(int i=1;i<=n;i++){
        update(1,1,n,i,i,i,0);
        update(1,1,n,i,i,i,1);
    }
    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_update(1,1,n,i,i,esq[i][0],0,0);
        aux_update(1,1,n,i,i,dir[i][0],0,1);
    }
    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_update(1,1,n,i,i,esq[i][b],b,0);
            aux_update(1,1,n,i,i,dir[i][b],b,1);
        }
    }
    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...