Submission #1272693

#TimeUsernameProblemLanguageResultExecution timeMemory
1272693goulthenCurtains (NOI23_curtains)C++20
100 / 100
521 ms137792 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define ll long long
#define rep(i,a,b) for (int i = a; i <= b; i++)
#define per(i,a,b) for (int i = a; i >= b; i--)
#define fi first
#define se second
#define pii pair<int,int>
#define pb push_back
#define all(v) (v).begin(), (v).end()

const int MAXN = 5e5+10;
const int INF = 1e18 + 5;
const int MOD = 1e9+7;

vector<int> tl[MAXN], tr[MAXN];
int closest[MAXN];

struct query {int l,r,id;};
int ans[MAXN];

void DC(int s, int e, vector<query> qrs) {
	if (qrs.empty()) return;
	if (s==e) {
		bool ok = 0;
		for (int x : tr[s]) if (x==e) ok = 1;
		for (query q : qrs) ans[q.id] = ok;
		return;
	}

	int m = (s+e)/2;

	vector<pii> stk;
	per(i,m,s) {
		int br = -1, ar = INF;
		for (int r : tr[i]) {
			if (r > e) continue;
			if (r>=m) ar=min(ar,r);
			else br = max(br, r);
		}

		closest[i] = INF;
		if(ar!=INF) closest[i] = min(closest[i],ar);
		while (!stk.empty()) {
			pii t = stk.back();
			if(t.fi <= br +1 || closest[i] <= t.se) {
				stk.pop_back();
				closest[i] = min(closest[i], t.se);
			} else break;
		}
		stk.push_back({i,closest[i]});

	}

	stk.clear();
	rep(i,m+1,e) {
		int bl = INF, al = -1;
		for (int l : tl[i]) {
			if (l < s) continue;
			if (l <= m+1) al = max(al,l);
			else bl = min(bl,l);
		}

		closest[i] = -1;
		if(al <= m+1) closest[i] = max(closest[i], al);

		while (!stk.empty()) {
			pii t = stk.back();
			if (bl-1 <= t.fi || closest[i] >= t.se) {
				stk.pop_back();
				closest[i] = max(closest[i], t.se);
			} else break;
		}
		stk.push_back({i,closest[i]});
	}

	vector<query> lq, rq;
	for (query q : qrs) {
		if (q.r <= m) lq.push_back(q);
		else if(q.l>m) rq.push_back(q);
		else {
			ans[q.id] = (closest[q.l] <= q.r && closest[q.r] >= q.l);
		}
	}

	DC(s,m,lq);
	DC(m+1,e, rq);
}

void solve() {
	int n,m,q;cin >> n >> m >> q;

	rep(i,1,m) {
		int l,r;cin >> l >> r;
		tr[l].pb(r);
		tl[r].pb(l);
	}

	vector<query> qrs;
	rep(i,1,q) {
		int l,r;cin >> l >> r;
		qrs.push_back({l,r,i});
	}

	DC(1,n,qrs);

	rep(i,1,q) {
		cout << (ans[i] ? "YES\n":"NO\n");	
	}
}

int32_t main() {
	ios_base::sync_with_stdio(0); cin.tie(nullptr);
	int tt = 1;
	//cin >> tt;

	while (tt--) 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...