제출 #1288459

#제출 시각아이디문제언어결과실행 시간메모리
1288459tunademayoRailway Trip 2 (JOI22_ho_t4)C++20
0 / 100
347 ms22672 KiB
#include<bits/stdc++.h>
using namespace std;

#define ll long long 
#define ld double

const bool Multitest = 0;

const int N = 1e5 + 10;

vector<int> op[N], cl[N];
int n, k, m, q;

int f[17][N];

struct SegmentTree
{
	int t[4 * N];
	
	void update(int id, int l, int r, int u, int val)
	{
		if(r < u || u < l) return;
		if(l == r)
		{
			t[id] = max(t[id], val);
			return;
		}
		
		int mid = (l + r) >> 1;
		
		update(id * 2, l, mid, u, val);
		update(id * 2 + 1, mid + 1, r, u, val);
		
		t[id] = max(t[id * 2], t[id * 2 + 1]);
	}	
	
	int get(int id, int l, int r, int u, int v)
	{
		if(r < u || v < l) return 0;
		if(u <= l && r <= v) return t[id];
		
		int mid = (l + r) >> 1;
		
		return max(get(id * 2, l, mid, u, v), get(id * 2 + 1, mid + 1, r, u, v));
	}
}; SegmentTree st;

void work()
{
	cin >> n >> k >> m;
		
	for(int i = 1 ; i <= m ; i++)
	{
		int l, r;	cin >> l >> r;
		
		if(l < r)
		{
			op[l - 1].push_back(-r);
			cl[min(r - 1, l + k - 1)].push_back(r);
		}
	}
	
	multiset<int> s;
	
	for(int i = n ; i >= 1 ; i--)
	{
		for(auto x : cl[i]) s.insert(x);
		for(auto x : op[i]) s.erase(s.find(-x));
		
		if(!s.empty()) f[0][i] = *s.rbegin();
		else f[0][i] = i;
	}
	
	for(int j = 1 ; j <= 16 ; j++)
	{
		for(int i = 1 ; i <= n ; i++) st.update(1, 1, n, i, f[j - 1][i]);
		
		for(int i = 1 ; i <= n ; i++)
		{
			int nxt = f[j - 1][i];
			
//			cout << i << ' ' << nxt << ' ' << st.get(1, 1, n, i, nxt) << '\n';
			
			f[j][i] = st.get(1, 1, n, i, nxt);
		}
	}
	
//	for(int i = 1 ; i <= n ; i++) cout << f[0][i] << ' '; cout << '\n';
//	
//	cout << f[1][3] << '\n';
	
	int q;	cin >> q;
	while(q--)
	{
		int l, r;	cin >> l >> r;
		
		if(l < r)
		{
			int ans = 0;
			
			for(int i = 16 ; i >= 0 ; i--)
			{
				int nxt = f[i][l];
				
				if(nxt < r) ans |= (1 << i), l = nxt;
			}
			
//			cout << ans << ' ' << l << ' ' << r << '\n';
			
			if(ans == (1 << 17) - 1) cout << -1 << '\n';
			else cout << ans + 1 << '\n';
 		}
	}
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);	cout.tie(0);

	int q = 1;
	
	if(Multitest)	cin >> q;
	
	while(q--) work();
}
#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...