제출 #594088

#제출 시각아이디문제언어결과실행 시간메모리
594088PoPularPlusPlusRailway Trip 2 (JOI22_ho_t4)C++17
100 / 100
798 ms77520 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long 
#define pb(e) push_back(e)
#define sv(a) sort(a.begin(),a.end())
#define sa(a,n) sort(a,a+n)
#define mp(a,b) make_pair(a,b)
#define vf first
#define vs second
#define ar array
#define all(x) x.begin(),x.end()
const int inf = 0x3f3f3f3f;
const int mod = 1000000007; 
const double PI=3.14159265358979323846264338327950288419716939937510582097494459230;
bool remender(ll a , ll b){return a%b;}

//freopen("problemname.in", "r", stdin);
//freopen("problemname.out", "w", stdout);

const int N = 200001;

struct item {
	int mx , mn;
};

struct Seg {
	ll siz = 1;
	vector<item> val;
	void init(int n){
		while(siz < n)siz*=2;
		
		val.resize(siz * 2);
		
	}
	
	item NutralElement = {-1 , N};
	
	item merge(item a , item b){
		return {max(a.mx , b.mx) , min(a.mn , b.mn)};
	}
	
	item single(pair<int,int> a){
		return {a.vf , a.vs};
	}
	
	void build(vector<pair<int,int>>& arr  , int x , int lx , int rx){
		if(rx-lx==1){
			if(lx < (int)arr.size()){
				val[x] = single(arr[lx]);
			}
			else val[x] = NutralElement;
			return;
		}
		int m = (lx + rx) / 2;
		build(arr , 2 * x + 1 , lx , m);
		build(arr, 2 * x + 2 , m , rx);
		val[x]=merge(val[2 * x + 1] , val[2 * x + 2]);
	}
	
	void build(vector<pair<int,int>>& arr){
		build(arr , 0 , 0 , siz);
	}
	
	item sum(int l , int r , int x , int lx , int rx){
		if(lx >= r  || l >= rx)return NutralElement;
		if(lx >= l && rx <= r)return val[x];
		int m = (lx + rx) / 2;
		item s1 = sum(l , r , 2 * x + 1 ,lx , m);
		item s2 = sum(l , r , 2 * x + 2, m , rx);
		return merge(s1,s2);
	}
	
	item sum(int l , int r){
		return sum(l , r , 0 , 0 , siz);
	}
	
};

void solve(){
	int n;
	cin >> n;
	int k;
	cin >> k;
	int m;
	cin >> m;
	int arr[m][2];
	for(int i = 0; i < m; i++){cin >> arr[i][0] >> arr[i][1]; arr[i][0]--,arr[i][1]--;}
	int L = 20;
	pair<int,int> range[n][L];
	Seg st[L];
	for(int i = 0; i < L; i++)
		st[i].init(n + 1);
	vector<pair<int,int>> v(n);
	int mx[n] , mn[n];
	set<pair<int,int> , greater<pair<int,int>>> s;
	vector<vector<int>> add(n+1) , remove(n+1);
	for(int i = 0; i < m; i++){
		if(arr[i][0] < arr[i][1]){
			add[arr[i][0]].pb(i);
			remove[min(arr[i][0] + k , arr[i][1])].pb(i);
		}
	}
	for(int i = 0; i < n; i++)mx[i] = mn[i] = i;
	for(int i = 0; i < n; i++){
		for(int j : add[i]){
			s.insert(mp(arr[j][1] , j));
		}
		for(int j : remove[i]){
			s.erase(mp(arr[j][1] , j));
		}
		if(s.size())
		mx[i] = (*(s.begin())).vf;
	}
	s.clear();
	for(int i = 0; i <= n; i++)add[i].clear(),remove[i].clear();
	for(int i = 0; i < m; i++){
		if(arr[i][0] > arr[i][1]){
			add[arr[i][0]].pb(i);
			remove[max(0,max(arr[i][0] - k + 1 , arr[i][1] + 1))].pb(i);
		}
	}
	set<pair<int,int>> s1;
	for(int i = n - 1; i >=0; i--){
		for(int j : add[i]){
			s1.insert(mp(arr[j][1] , j));
		}
		if(s1.size())
		mn[i] = (*(s1.begin())).vf;
		for(int j : remove[i]){
			s1.erase(mp(arr[j][1] , j));
		}
	}
	//for(int i = 0; i < n; i++)cout << mx[i] << ' ' << mn[i] << '\n';
	for(int j = 0; j < L; j++){
		for(int i = 0; i < n; i++){
			if(j == 0)v[i] = range[i][j] = mp(mx[i] , mn[i]);
			else {
				if(v[i].vf == N && v[i].vs == -1){
					range[i][j] = v[i];
					continue;
				}
				item it = st[j-1].sum(v[i].vs, v[i].vf + 1);
				v[i] = mp(it.mx , it.mn);
				range[i][j] = v[i];
			}
		}
		st[j].build(v);
	}
	int q;
	cin >> q;
	
	while(q--){
		int s2 , t;
		cin >> s2 >> t;
		s2--;
		t--;
		int ans = 0;
		int l = s2 , r = s2;
		for(int i = L - 1; i >= 0; i--){
			item it = st[i].sum(l,r+1);
			if(it.mx == r && it.mn == l){
				ans = -2;
				break;
			}
			if(it.mx >= t && it.mn <= t)continue;
			ans += (1 << i);
			l = min(l , it.mn);
			r = max(r , it.mx);
		}
		ans++;
		cout << ans << '\n';
	}
}

int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
	//int t;cin >> t;while(t--)
	solve();
	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...