제출 #535091

#제출 시각아이디문제언어결과실행 시간메모리
535091nathanlee726Railway Trip 2 (JOI22_ho_t4)C++14
100 / 100
1402 ms42208 KiB
//#include<i_am_noob_orz>
#include<bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using namespace std;
#define ll long long
//#define int ll
#define ull unsigned long long
#define pii pair<int,int>
#define X first
#define Y second
#define mod ((ll)1e9+7)
#define pb push_back
#define mp make_pair
#define abs(x) ((x)>0?(x):(-(x)))
#define F(n) Fi(i,n)
#define Fi(i,n) Fl(i,0,n)
#define Fl(i,l,n) for(int i=l;i<n;i++)
#define memres(a) memset(a,0,sizeof(a))
#define all(a) a.begin(),a.end()
#define sz(a) ((int)a.size())
#define ceiling(a,b) (((a)+(b)-1)/(b))
#define endl '\n'
#define bit_count(x) __builtin_popcountll((x))
#define ykh mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define jimmy_is_kind false
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> rbtree;

//#define LOCAL
#ifdef LOCAL
#define bug(...) cerr<<"#"<<__LINE__<<' '<<#__VA_ARGS__<<"- ", _do(__VA_ARGS__)
template<typename T> void _do(T && x) {cerr<<x<<endl;}
template<typename T, typename ...S> void _do(T && x, S&&...y) {cerr<<x<<", "; _do(y...);}
#define IOS()
#else
#define IOS() ios_base::sync_with_stdio(0), cin.tie(0)
#define endl '\n'
#define bug(...)
#endif

int add(int a,int b){return(a+b>=mod?a+b-mod:a+b);}
int sub(int a,int b){return(a<b?a+mod-b:a-b);}
int po(int a,int b){
	if(b==0)return 1;
	if(b==1)return(a%mod);
	int tem=po(a,b/2);
	if(b&1)return(((tem*tem)%mod)*a)%mod;
	else return(tem*tem)%mod;
}
int GCD(int a,int b){
	int x=0;
	int ra,rb;
	while(a&&b){
		if(((a&1)==0)&&((b&1)==0)){
			a>>=1,b>>=1,x++;
		}
		else if((a^b)&1){
			if(a&1)b>>=1;
			else a>>=1;
		}
		else{
			ra=abs(a-b),rb=min(a,b);
			a=ra,b=rb;
		}
	}
	return max(a,b)<<x;
}
int gcd(int a,int b){if(b==0)return a;return gcd(b,a%b);}

pii seg[400010][18],tg[400010];
int n,m,k;


void build(int p,int l,int r){
    tg[p]={1e9,0};
    if(l==r){
        F(18)seg[p][i]={l,l};
        return;
    }
    int mi=(l+r)/2;
    build(p*2,l,mi);
    build(p*2+1,mi+1,r);
    return;
}

void modi(int p,int l,int r,int ql,int qr,int vl,int vr){
    if(l>qr||r<ql)return;
    if(l>=ql&&r<=qr){
        seg[p][0].Y=max(seg[p][0].Y,vr);
        tg[p].Y=max(tg[p].Y,vr);
        seg[p][0].X=min(seg[p][0].X,vl);
        tg[p].X=min(tg[p].X,vl);
        return;
    }
    int mi=(l+r)/2;
    seg[p*2][0].Y=max(seg[p*2][0].Y,tg[p].Y);
    seg[p*2+1][0].Y=max(seg[p*2+1][0].Y,tg[p].Y);
    seg[p*2][0].X=min(seg[p*2][0].X,tg[p].X);
    seg[p*2+1][0].X=min(seg[p*2+1][0].X,tg[p].X);
    tg[p*2].Y=max(tg[p*2].Y,tg[p].Y);
    tg[p*2+1].Y=max(tg[p*2+1].Y,tg[p].Y);
    tg[p*2].X=min(tg[p*2].X,tg[p].X);
    tg[p*2+1].X=min(tg[p*2+1].X,tg[p].X);
    tg[p]={1e9,0};
    modi(p*2,l,mi,ql,qr,vl,vr);
    modi(p*2+1,mi+1,r,ql,qr,vl,vr);
    seg[p][0].X=min(seg[p*2][0].X,seg[p*2+1][0].X);
    seg[p][0].Y=max(seg[p*2][0].Y,seg[p*2+1][0].Y);
    return;
}

void modify(int p,int lg,int l,int r,int x,int vl,int vr){
    if(l==r){
        seg[p][lg].Y=max(seg[p][lg].Y,vr);
        seg[p][lg].X=min(seg[p][lg].X,vl);
        return;
    }
    int mi=(l+r)/2;
    if(mi>=x)modify(p*2,lg,l,mi,x,vl,vr);
    else modify(p*2+1,lg,mi+1,r,x,vl,vr);
    seg[p][lg].X=min(seg[p*2][lg].X,seg[p*2+1][lg].X);
    seg[p][lg].Y=max(seg[p*2][lg].Y,seg[p*2+1][lg].Y);
}

pii query(int p,int lg,int l,int r,int ql,int qr){
    if(l>qr||r<ql)return {1e9,0};
    if(l>=ql&&r<=qr)return seg[p][lg];
    int mi=(l+r)/2;
    pii tp1=query(p*2,lg,l,mi,ql,qr);
    pii tp2=query(p*2+1,lg,mi+1,r,ql,qr);
    pii tpp={min(tp1.X,tp2.X),max(tp1.Y,tp2.Y)};
    return tpp;
}

void push(int p,int l,int r){
    if(l==r){
        return;
    }
    int mi=(l+r)/2;
    seg[p*2][0].Y=max(seg[p*2][0].Y,tg[p].Y);
    seg[p*2+1][0].Y=max(seg[p*2+1][0].Y,tg[p].Y);
    seg[p*2][0].X=min(seg[p*2][0].X,tg[p].X);
    seg[p*2+1][0].X=min(seg[p*2+1][0].X,tg[p].X);
    tg[p*2].Y=max(tg[p*2].Y,tg[p].Y);
    tg[p*2+1].Y=max(tg[p*2+1].Y,tg[p].Y);
    tg[p*2].X=min(tg[p*2].X,tg[p].X);
    tg[p*2+1].X=min(tg[p*2+1].X,tg[p].X);
    tg[p]={1e9,0};
    push(p*2,l,mi);
    push(p*2+1,mi+1,r);
    seg[p][0].X=min(seg[p*2][0].X,seg[p*2+1][0].X);
    seg[p][0].Y=max(seg[p*2][0].Y,seg[p*2+1][0].Y);
}

signed main(){
	IOS();
    cin>>n>>k>>m;
    build(1,0,n-1);
    F(m){
        int l,r;
        cin>>l>>r;
        --l,--r;
        if(l<r){
            modi(1,0,n-1,l,min(l+k-1,r),1e9,r);
        }
        else modi(1,0,n-1,max(l-k+1,r),l,r,0);
    }
    push(1,0,n-1);
    for(int j=1;j<=17;j++){
        F(n){
            pii tp=query(1,j-1,0,n-1,i,i);
            //bug(j,tp.X,tp.Y);
            tp=query(1,j-1,0,n-1,tp.X,tp.Y);
            //bug(tp.X,tp.Y);
            modify(1,j,0,n-1,i,tp.X,tp.Y);
        }
    }
    int q;
    cin>>q;
    while(q--){
        int s,t;
        cin>>s>>t;
        --s,--t;
        pii tp={s,s};
        int ss=0;
        for(int j=17;j>=0;j--){
            pii ttp=query(1,j,0,n-1,tp.X,tp.Y);
            //ug(j,tp.X,tp.Y,ttp.X,ttp.Y);
            if(ttp.X<=t&&t<=ttp.Y);
            else tp=ttp,ss+=(1ll<<j);
        }
        tp=query(1,0,0,n-1,tp.X,tp.Y);
        ss++;
        if(tp.X<=t&&t<=tp.Y){
            cout<<ss<<endl;
        }
        else cout<<"-1"<<endl;
    }
	return 0;
}
#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...