Submission #1212183

#TimeUsernameProblemLanguageResultExecution timeMemory
1212183vtnooCurtains (NOI23_curtains)C++20
100 / 100
1146 ms87296 KiB
/*
 * puedo ordenar las consultas, hacer todo offline, si tengo una query[s, e]
 * l[i]==s, SE PUEDEN SUPERPONER
 */

#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <cstring>

#define pb push_back
#define snd second
#define fst first
#define forn(i,n) for(int i=0;i<n;++i)
#define forsn(i,s,n) for(int i=s; i<n; ++i)
#define all(x) x.begin(), x.end()
#define imp(x) for(auto __:x)cout<<__<<" "; cout<<endl;
#define sz(c) int((c).size())
#define mset(a,v) memset((a), (v), sizeof(a));

using namespace std;

typedef long long ll;
typedef pair<int, int> ii;
typedef vector<int> vi;

const int N=500005, inf=1e9;
int st[N*4], lazy[N*4];

void push(int node, int s, int e){
	if(lazy[node]==inf)return;
	st[node]=min(st[node], lazy[node]);
	if(s<e){
		lazy[node*2]=min(lazy[node*2],lazy[node]);
		lazy[node*2+1]=min(lazy[node*2+1],lazy[node]);
	}
	lazy[node]=inf;
}

void update(int node, int s, int e, int v, const int& l, const int& r){
	push(node,s,e);
	if(e<l||s>r){
		return;
	}else if(l<=s&&e<=r){
		lazy[node]=v;
		push(node,s,e);
		return;
	}
	int m=(s+e)/2;
	update(node*2, s, m, v, l, r);
	update(node*2+1, m+1, e, v, l, r);
	st[node]=max(st[node*2], st[node*2+1]);
}

int query(int node, int s, int e, const int& l, const int& r){
	push(node,s,e);
	if(e<l||s>r){
		return 0;
	}else if(l<=s&&e<=r){
		return st[node];
	}
	int m=(s+e)/2;
	return max(query(node*2, s, m, l, r), query(node*2+1, m+1, e, l, r));
}

int main(){	
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	int n,m,q;cin>>n>>m>>q;
	forn(i,N*4)st[i]=inf, lazy[i]=inf;
	vi l(m), r(m);
	vector<string> w(q);
	vector<vi> range(n); 
	vector<vector<ii>> que(n);
	forn(i,m){
		cin>>l[i]>>r[i];
		l[i]--;r[i]--;
		range[l[i]].push_back(r[i]);
	}
	forn(i,q){
		int s,e;cin>>s>>e;
		s--;e--;
		que[s].push_back({e,i});
	}
	for(int i=n-1; i>=0; i--){//i==l
		for(auto rr:range[i]){
			update(1, 0, n-1, rr, i, rr);
		}
		for(auto [rr, idx]:que[i]){
			w[idx]=(query(1, 0, n-1, i, rr)==rr?"YES":"NO");
		}
	}
	forn(i,q)cout<<w[i]<<endl;
}	



#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...