제출 #930209

#제출 시각아이디문제언어결과실행 시간메모리
930209NK_Osumnjičeni (COCI21_osumnjiceni)C++17
110 / 110
943 ms40576 KiB
// Success consists of going from failure to failure without loss of enthusiasm
#include <bits/stdc++.h>

using namespace std;

#define nl '\n'

template<class T> using V = vector<T>;
using vi = V<int>;

struct Seg {
	const int ID = 0; int cmb(int a, int b) { return a + b; };
	vi seg, lazy; int N; void init(int n) {
		for(N = 1; N < n; N *= 2); 
		seg.assign(2 * N, 0); lazy.assign(2 * N, -1);
	}

	void pull(int x) { seg[x] = cmb(seg[2*x], seg[2*x+1]); }

	void push(int x, int L, int R) {
		if (lazy[x] != -1) {
			seg[x] = (R-L+1) * lazy[x];
			if (L != R) for(int i = 0; i < 2; i++) lazy[2*x+i] = lazy[x];
			lazy[x] = -1;
		}
	}

	void upd(int l, int r, int v, int x, int L, int R) {
		push(x, L, R); if (R < l || r < L) return;
		if (l <= L && R <= r) {
			lazy[x] = v; push(x, L, R); return;
		}
		int M = (L + R) / 2;
		upd(l, r, v, 2 * x, L, M);
		upd(l, r, v, 2 * x + 1, M + 1, R);
		pull(x);
	}

	int query(int l, int r, int x, int L, int R) {
		push(x, L, R); if (R < l || r < L) return ID;
		if (l <= L && R <= r) return seg[x];
		int M = (L + R) / 2;
		return cmb(query(l, r, 2 * x, L, M), query(l, r, 2 * x + 1, M + 1, R));
	}

	void upd(int l, int r, int v) { upd(l, r, v, 1, 0, N - 1); }
	int qry(int l, int r) { return query(l, r, 1, 0, N - 1); }
};

const int LG = 19;
int main() {
	cin.tie(0)->sync_with_stdio(0);
	
	int N; cin >> N;

	vi L(N), R(N); for(int i = 0; i < N; i++) cin >> L[i] >> R[i];

	int M = -1;
	{
		map<int, int> mp; int cur = 0;
		for(auto& x : L) mp[x]++; 
		for(auto& x : R) mp[x]++;
		for(auto& x : mp) x.second = cur++;
		for(auto& x : L) x = mp[x];
		for(auto& x : R) x = mp[x];
		M = cur;
	}
	
	Seg st; st.init(M);

	V<vi> nxt(N + 1, vi(LG, N)); int bnd = 0;
	for(int i = 0; i < N; i++) {
		// cout << i << " ==> " << L[i] << " " << R[i] << endl;
		while(bnd < N && !st.qry(L[bnd], R[bnd])) {
			st.upd(L[bnd], R[bnd], 1);
			bnd++;
		}

		nxt[i][0] = bnd;
		// cout << i << " => " << bnd << endl;
		st.upd(L[i], R[i], 0);
	}

	for(int x = N - 1; x >= 0; x--) {
		for(int i = 1; i < LG; i++) nxt[x][i] = nxt[nxt[x][i-1]][i-1];
	}

	int Q; cin >> Q;
	for(int q = 0; q < Q; q++) {
		int l, r; cin >> l >> r; --l, --r;

		int ans = 0;
		for(int i = LG - 1; i >= 0; i--) {
			if (nxt[l][i] <= r) { ans += (1 << i); l = nxt[l][i]; }
		}

		cout << ans + 1 << nl;
	}



	exit(0-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...