제출 #1361992

#제출 시각아이디문제언어결과실행 시간메모리
1361992Jawad_Akbar_JJRailway Trip 2 (JOI22_ho_t4)C++20
100 / 100
245 ms60368 KiB
#include <iostream>
#include <vector>
#include <set>

using namespace std;
const int N = 1<<17;
int Mn[20][N<<1], Mx[20][N<<1];
vector<int> Add[2][N], rem[2][N];
int L[N], R[N];

void updLR(int j, int l, int r, int &X, int &Y){
	for (l += N - 1, r += N + 1; l + 1 < r; l /= 2, r /= 2){
		if (!(l & 1))
			X = min(X, Mn[j][l ^ 1]), Y = max(Y, Mx[j][l ^ 1]);
		if (r & 1)
			X = min(X, Mn[j][r ^ 1]), Y = max(Y, Mx[j][r ^ 1]);
	}
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int n, m, k, q;
	cin>>n>>k>>m;

	for (int i=1, l, r;i<=m;i++){
		cin>>l>>r;

		if (l < r){
			Add[0][l].push_back(r);
			rem[0][min(r+1, l+k)].push_back(r);
		}
		else{
			Add[1][max(r, l-k+1)].push_back(r);
			rem[1][l+1].push_back(r);
		}
	}

	multiset<int> st[2];
	for (int i=1;i<=n;i++){
		for (int j : {0, 1}){
			for (int l : Add[j][i])
				st[j].insert(l);
			for (int l : rem[j][i])
				st[j].erase(st[j].find(l));
		}

		L[i] = R[i] = i;
		if (st[0].size() > 0)
			R[i] = *rbegin(st[0]);
		if (st[1].size() > 0)
			L[i] = *begin(st[1]);
	}

	for (int j=0;j<18;j++){

		for (int i=N;i<N+N;i++)
			Mn[j][i] = L[i - N], Mx[j][i] = R[i - N];
		
		for (int i=N-1; i; i--){
			Mn[j][i] = min(Mn[j][i+i], Mn[j][i+i+1]);
			Mx[j][i] = max(Mx[j][i+i], Mx[j][i+i+1]);
		}
		for (int i=1;i<=n;i++)
			updLR(j, L[i], R[i], L[i], R[i]);
	}

	cin>>q;

	for (int i=1;i<=q;i++){
		int x, y;
		cin>>x>>y;

		if (L[x] > y or R[x] < y){
			cout<<-1<<'\n';
			continue;
		}

		int l = x, r = x, ans = 1, a, b;

		for (int j=17;j + 1; j--){
			updLR(j, l, r, a = l, b = r);
			if (a > y or b < y)
				ans += (1<<j), l = a, r = b;
		}

		cout<<ans<<'\n';
	}
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…