Submission #1007874

#TimeUsernameProblemLanguageResultExecution timeMemory
1007874imarnRailway Trip 2 (JOI22_ho_t4)C++14
100 / 100
342 ms40532 KiB
#include<bits/stdc++.h>
//#include "gap.h"
#pragma GCC optimize("O3")
#pragma GCC target("avx2")
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define plx pair<ll,int>
#define f first
#define s second
#define pb push_back
#define all(x) x.begin(),x.end()
using namespace std;
const int mxn=1e5+5;
struct laz{
    int t[4*mxn]{0},lz[4*mxn]{0};
    void build(int i,int l,int r,int x){
        lz[i]=-1e9;
        if(l==r)return void(t[i]=l*x);
        int m=(l+r)>>1;build(2*i,l,m,x);build(2*i+1,m+1,r,x);
        t[i]=max(t[2*i],t[2*i+1]);
    }
    void push(int i,int l,int r){
        t[i]=max(lz[i],t[i]);
        if(l<r)lz[2*i]=max(lz[i],lz[2*i]),lz[2*i+1]=max(lz[i],lz[2*i+1]);
        lz[i]=-1e9;
    }
    void update(int i,int l,int r,int tl,int tr,int v){
        push(i,l,r);
        if(r<tl||l>tr)return;
        if(r<=tr&&l>=tl){
            lz[i]=max(lz[i],v);push(i,l,r);return;
        }int m=(l+r)>>1;update(2*i,l,m,tl,tr,v);update(2*i+1,m+1,r,tl,tr,v);
        t[i]=max(t[2*i],t[2*i+1]);
    }
    int qr(int i,int l,int r,int idx){
        push(i,l,r);
        if(r<idx||l>idx)return -1e9;
        if(l==r)return t[i];
        int m=(l+r)>>1;
        return max(qr(2*i,l,m,idx),qr(2*i+1,m+1,r,idx));
    }
}lsl,lsr;
struct tree{
    int t[2*mxn];
    int qr(int l,int r,int sz,int res=-1e9){
        for(l+=sz,r+=sz;l<r;l>>=1,r>>=1){
            if(l&1)res=max(res,t[l++]);
            if(r&1)res=max(res,t[--r]);
        }return res;
    }
}sl[20],sr[20];
int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    int n,k,m;cin>>n>>k>>m;
    lsl.build(1,1,n,-1);
    lsr.build(1,1,n,1);
    for(int i=1;i<=m;i++){
        int a,b;cin>>a>>b;
        if(a<=b)lsr.update(1,1,n,a,min(a+k-1,b-1),b);
        else lsl.update(1,1,n,max(b+1,a-k+1),a,-b);
    }
    for(int i=0;i<n;i++){
        sl[0].t[i+n]=lsl.qr(1,1,n,i+1);
        sr[0].t[i+n]=lsr.qr(1,1,n,i+1);
    }
    for(int i=n-1;i>0;i--)sl[0].t[i]=max(sl[0].t[2*i],sl[0].t[2*i+1]),sr[0].t[i]=max(sr[0].t[2*i],sr[0].t[2*i+1]);
    for(int j=1;j<20;j++){
        for(int i=1;i<=n;i++){
            int tl=-sl[j-1].qr(i-1,i,n);
            int tr=sr[j-1].qr(i-1,i,n);
            int vl=sl[j-1].qr(tl-1,tr,n);
            int vr=sr[j-1].qr(tl-1,tr,n);
            sl[j].t[i+n-1]=vl;sr[j].t[i+n-1]=vr;
        }for(int i=n-1;i>0;i--)sl[j].t[i]=max(sl[j].t[2*i],sl[j].t[2*i+1]),sr[j].t[i]=max(sr[j].t[2*i],sr[j].t[2*i+1]);
    }int q;cin>>q;
    while(q--){
        int u,v;cin>>u>>v;
        int l=u,r=u;int ans=0;
        int tl=-sl[19].qr(l-1,r,n);
        int tr=sr[19].qr(l-1,r,n);
        if(tl>v||tr<v){cout<<-1<<'\n';continue;}
        for(int i=19;i>=0;i--){
            int tl=-sl[i].qr(l-1,r,n);
            int tr=sr[i].qr(l-1,r,n);
            if(tl>v||tr<v)ans|=(1<<i),l=tl,r=tr;
        }cout<<ans+1<<'\n';
    }
}
#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...