제출 #867210

#제출 시각아이디문제언어결과실행 시간메모리
867210NotLinuxRailway Trip 2 (JOI22_ho_t4)C++17
100 / 100
1851 ms114856 KiB
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize ("O3,unroll-loops")
#pragma GCC target ("avx2,bmi,bmi2,lzcnt,popcnt")
const int N = 1e5 + 7;
const int M = 20;
const int inf = 1e9 + 7;
struct SEGT{//range update , range query
	vector < int > tree;
	int sz;
	SEGT(){
		sz = N;
		tree.assign(4 * sz , -inf);
	}
	inline int _query(int ind , int l , int r , int ql , int qr){
		if(l >= ql and r <= qr)return tree[ind];
		else if(l > qr or r < ql)return -inf;
		int mid = (l+r)/2;
		return max(_query(ind*2,l,mid,ql,qr) , _query(ind*2+1,mid+1,r,ql,qr));
	}
	inline int query(int l , int r){return _query(1,1,sz,l,r);}
	inline void _update(int ind , int l , int r , int qp , int qv){
		if(l == r){
			tree[ind] = max(tree[ind] , qv);
			return;
		}
		int mid = (l+r)/2;
		if(mid >= qp)_update(ind*2,l,mid,qp,qv);
		else _update(ind*2+1,mid+1,r,qp,qv);
		tree[ind] = max(tree[ind*2] , tree[ind*2+1]);
	}
	inline void update(int p ,int v){_update(1,1,sz,p,v);}
};
SEGT leftmost[M],rightmost[M];
void solve(){
	int n,k,m;cin >> n >> k >> m;
	int a[m],b[m];
	multiset < int > sol[N],sag[N],soldel[N],sagdel[N];
	for(int i = 1;i<N;i++){
		leftmost[0].update(i,-i);
		rightmost[0].update(i,i);
	}
	for(int i = 0;i<m;i++){
		cin >> a[i] >> b[i];
		if(a[i] < b[i]){
			sol[a[i]].insert(b[i]);
			soldel[a[i]+k-1].insert(b[i]);
		}
		else{
			sag[a[i]].insert(b[i]);
			sagdel[a[i]-k+1].insert(b[i]);
		}
	}
	multiset < int > cur;
	for(int i = 1;i<N;i++){
		for(auto itr : sol[i])cur.insert(itr);
		if(cur.size())rightmost[0].update(i,*--cur.end());
		for(auto itr : soldel[i])cur.extract(itr);
	}
	cur.clear();
	for(int i = N-1;i>=1;i--){
		for(auto itr : sag[i])cur.insert(itr);
		if(cur.size())leftmost[0].update(i,-*cur.begin());
		for(auto itr : sagdel[i])cur.extract(itr);
	}
	//cout << "leftmost : ";for(int i = 1;i<=n;i++)cout << leftmost[0].query(i,i) << " ";cout << endl;
	//cout << "rightmost : ";for(int i = 1;i<=n;i++)cout << rightmost[0].query(i,i) << " ";cout << endl;
	for(int i = 1;i<M;i++){
		for(int j = 1;j<=n;j++){
			int lp = -leftmost[i-1].query(j , j);
			int rp = rightmost[i-1].query(j , j);
			leftmost[i].update(j ,  leftmost[i-1].query(lp , rp));
			rightmost[i].update(j , rightmost[i-1].query(lp , rp));
		}
	}
	int q;cin >> q;
	while(q--){
		int s,t,ans=0;cin >> s >> t;
		if(s == t){
			cout << 0 << endl;
			return;
		}
		pair < int , int > cur = {s,s};
		bool bl = 1;
		for(int i = M-1;i>=0;i--){
			pair < int , int > ncur = {-leftmost[i].query(cur.first,cur.second) , rightmost[i].query(cur.first,cur.second)};
			if(ncur.second < t or ncur.first > t){//al
				cur = ncur;
				ans += 1 << i;
			}
			else bl = 0;
		}
		cout << (bl?-1:ans+1) << '\n';
	}
}
signed main(){
	ios_base::sync_with_stdio(0);cin.tie(0);
	int testcase = 1;//cin >> testcase;
	while(testcase--)solve();
}
#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...