제출 #1288523

#제출 시각아이디문제언어결과실행 시간메모리
1288523tunademayoRailway Trip 2 (JOI22_ho_t4)C++20
0 / 100
1323 ms90592 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], op1[N], cl1[N];
int n, k, m, q, POS[N];

int f[18][N], g[18][N], ans[N];

struct SegmentTree
{
	int t[4 * N]; bool Type;
	
	int merge(int a, int b)
	{
		if(Type == 1) return max(a, b);
		return min(a, b);	
	}
	
	void init(bool _Type)
	{
		Type = _Type;
		for(int i = 1 ; i < 4 * N ; i++)
		{
			if(Type == 1) t[i] = 0;
			else t[i] = 1e9;  
		}
	}
	
	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] = merge(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 merge(get(id * 2, l, mid, u, v), get(id * 2 + 1, mid + 1, r, u, v));
	}
}; SegmentTree st[18], st1[18];

int lift(int u, int cnt)
{
	if(cnt == 0) return u;
	
	int v = __builtin_ctz(cnt & (-cnt)), r = f[v][u];
	
	for(int i = v + 1 ; i <= 17 ; i++)
	{
		if((cnt >> i) & 1)
		{
			r = st[i].get(1, 1, n, u, r);
		}
	}
	
	return r;
}

struct Line
{
	int l, r;
}; Line a[N];

struct Queries
{
	int l, r;
}; Queries t[N];

void pre()
{
	for(int i = 1 ; i <= n ; i++)
	{
		op[i].clear();
		cl[i].clear();
		op1[i].clear();
		cl1[i].clear();
	}
	
	for(int i = 0 ; i <= 17 ; i++)
	{
		for(int j = 1 ; j <= n ; j++)
		{
			f[i][j] = 0;	
			g[i][j] = 0;
		}
		st[i].init(1);
		st1[i].init(0);
	}
}

void process()
{
	pre();
//	cerr << "okay" << "\n";
	for(int i = 1 ; i <= m ; i++)
	{
		int l = a[i].l, r = a[i].r;
		
		if(l < r)
		{
			op[l - 1].push_back(-r);
			cl[min(r - 1, l + k - 1)].push_back(r);
		}
		else 
		{
			swap(l, r);
			op1[r + 1].push_back(-l);
			cl1[max(l + 1, r - k + 1)].push_back(l);
			swap(l, r);
		}
	}
//	cerr << "okay" << '\n';
	
	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;
	}
	
	s.clear();
	
	for(int i = 1 ; i <= n ; i++)
	{
		for(auto x : cl1[i]) s.insert(x);
		for(auto x : op1[i]) s.erase(s.find(-x));
		
//		cerr << i << '\n';
		
		if(!s.empty()) g[0][i] = *s.begin();
		else g[0][i] = i;
	}
	
//	cerr << "okay" << '\n';
	
	for(int j = 1 ; j <= 18 ; j++)
	{
		for(int i = 1 ; i <= n ; i++) st[j - 1].update(1, 1, n, i, f[j - 1][i]), st1[j - 1].update(1, 1, n, i, g[j - 1][i]);
		if(j > 17) break;
		
		for(int i = 1 ; i <= n ; i++)
		{
			int nxt = f[j - 1][i];
			int nxt1 = g[j - 1][i];
			
			f[j][i] = st[j - 1].get(1, 1, n, nxt1, nxt);
			g[j][i] = st1[j - 1].get(1, 1, n, nxt1, nxt);
		}
	}
	
	for(int i = 1 ; i <= q ;  i++)
	{
		int l = t[i].l, r = t[i].r;
		if(l < r)
		{
//			int ans = 0;
	
			int li = 0, ri = n, pos = -1;
			
			while(li <= ri)
			{
				int mid = (li + ri) >> 1;
				
				if(lift(l, mid) >= r) ri = mid - 1, pos = mid;
				else li = mid + 1;
			}
			
			ans[i] = pos;
 		}
	}
}

void work()
{
	cin >> n >> k >> m;
//	cerr << "done" << '\n';	
	pre();
		
	for(int i = 1 ; i <= m ; i++)
	{
		cin >> a[i].l >> a[i].r;
	} 
	
	for(int i = 1, j = n ; i <= n ; i++, j--)
	{
		POS[j] = i;
	}
//	cerr << "done" << '\n';
	cin >> q;
	for(int i = 1 ; i <= q ; i++) cin >> t[i].l >> t[i].r;
	
	process();
	for(int i = 1 ; i <= m ; i++)
	{
		a[i].l = POS[a[i].l];
		a[i].r = POS[a[i].r];
	}
	
	for(int i = 1 ; i <= q ; i++)
	{
		t[i].l = POS[t[i].l];
		t[i].r = POS[t[i].r];
	}
	process();
	
	for(int i = 1 ; i <= q ; i++) cout << ans[i] << '\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...