Submission #704423

#TimeUsernameProblemLanguageResultExecution timeMemory
704423ld_minh4354Railway Trip 2 (JOI22_ho_t4)C++17
27 / 100
2066 ms31472 KiB
#include<bits/stdc++.h>
using namespace std;

#define int long long
#define fi first
#define se second
#define pb push_back
#define debug(x) cout<<#x<<": "<<x<<"\n"

struct node
{
	int s,e,m,val,lazy;
	node *l,*r;
	
	node(int S,int E)
	{
		s=S;e=E;m=(s+e)/2;
		val=S;lazy=1e9;
		
		if (s!=e)
		{
			l=new node(s,m);
			r=new node(m+1,e);
		}
	}
	
	void prop()
	{
		if (lazy==1e9) return;
		val=min(val,lazy);
		
		if (s!=e)
		{
			l->lazy = min(l->lazy,lazy);
			r->lazy = min(r->lazy,lazy);
		}
		lazy=1e9;
	}
	
	void update(int S,int E,int V)
	{
		if (s==S and e==E) lazy = min(lazy, V);
		else
		{
			if (E<=m) l->update(S,E,V);
			else if (S>m) r->update(S,E,V);
			else
			{
				l->update(S,m,V);r->update(m+1,E,V);
			}
			
			l->prop();r->prop();
			val=min(l->val,r->val);
		}
		
	}
	
	int query(int S,int E)
	{
		prop();
		
		if (s==S and e==E) return val;
		else if (E<=m) return l->query(S,E);
		else if (S>m) return r->query(S,E);
		else return min(l->query(S,m), r->query(m+1,E));
	}
}*lroot;

struct node2
{
	int s,e,m,val,lazy;
	node2 *l,*r;
	
	node2(int S,int E)
	{
		s=S;e=E;m=(s+e)/2;
		val=E;lazy=0;
		
		if (s!=e)
		{
			l=new node2(s,m);
			r=new node2(m+1,e);
		}
	}
	
	void prop()
	{
		if (lazy==0) return;
		val=max(val,lazy);
		
		if (s!=e)
		{
			l->lazy = max(l->lazy,lazy);
			r->lazy = max(r->lazy,lazy);
		}
		lazy=0;
	}
	
	void update(int S,int E,int V)
	{
		if (s==S and e==E) lazy = max(lazy, V);
		else
		{
			if (E<=m) l->update(S,E,V);
			else if (S>m) r->update(S,E,V);
			else
			{
				l->update(S,m,V);r->update(m+1,E,V);
			}
			
			l->prop();r->prop();
			val=max(l->val,r->val);
		}
		
	}
	
	int query(int S,int E)
	{
		prop();
		
		if (s==S and e==E) return val;
		else if (E<=m) return l->query(S,E);
		else if (S>m) return r->query(S,E);
		else return max(l->query(S,m), r->query(m+1,E));
	}
}*rroot;

signed main()
{
	ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//	freopen("input.000","r",stdin);
//	freopen("output.000","w",stdout);
//	srand((unsigned)time(NULL));
//	rand()
	
	int n,k,m,a[200005],b[200005],s,t,l,lnew,r,rnew,ans,i,q;
	bool stop;
	
	cin>>n>>k>>m;
	for (i=1;i<m+1;i++) cin>>a[i]>>b[i];
	
	lroot=new node(1,n);
	rroot=new node2(1,n);
	
	for (i=1;i<m+1;i++)
	if (a[i]<b[i]) rroot->update(a[i], min(a[i]+k-1,b[i]), b[i]);
	else lroot->update(max(a[i]-k+1,b[i]), a[i], b[i]);
	
	cin>>q;
	for (i=1;i<q+1;i++)
	{
		cin>>s>>t;
		ans=0;l=r=s;stop=false;
		while ((t<l or t>r) and !stop)
		{
			lnew=lroot->query(l,r);
			rnew=rroot->query(l,r);
			
			if (l==lnew and r==rnew) stop=true;
			l=lnew;r=rnew;ans++;
		}
		
		if (stop) cout<<"-1\n";else cout<<ans<<"\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...