#include<bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
#define int long long
typedef pair<int,int> pii;
typedef vector<pii> vii;
typedef vector<int> vi;
typedef vector<bool> vb;
#define FOR(i,a) for(int i=0;i<(a);i++)
#define FORE(i,a,b) for(int i=(a);i<(b);i++)
#define all(x) x.begin(),x.end()
#define fi first
#define se second
#define pb push_back
#define sp <<" "<<
#define cont(x) for(auto el:x) cout<<el<<' ';cout<<endl;
#define contp(x) for(auto el:x) cout<<el.fi<<'-'<<el.se<<' ';cout<<endl;
#define DEBUG(x) cout<<#x sp x<<endl;
#define carp(x,y) ((x%MOD)*(y%MOD))%MOD
#define topla(x,y) ((x%MOD)+(y%MOD))%MOD
#define mid (l+r)/2
const int MAXN=5e5+5;
const int MOD=1e9+7;
const int INF=1e18;
int n,m,q;
vii ar;
vii tut[MAXN];
vii t[4*MAXN];
vii pref[4*MAXN]; //{boşluk,gidebilecek en uzak mesafe}
void merge(vii& c,vii& a, vii& b,int nd,int l,int r){
int sz1=a.size();
int sz2=b.size();
int p1,p2;
p1=p2=0;
int bir,iki;
bir=-1;
iki=-1;
vi vec;
while(p1<sz1 or p2<sz2){
if(p1>=sz1 or (p2<sz2 and a[p1].fi>b[p2].fi)){
int deg=ar[b[p2].se].fi;
if(c.empty()){
if(deg>l){
FORE(i,l,deg){
vec.pb(i);
}
}
}
else{
int once=c.back().fi;
if(deg>once){
FORE(i,once+1,deg){
vec.pb(i);
}
}
else{
while(!vec.empty() and vec.back()>=deg) vec.pop_back();
}
}
iki=max(pref[nd*2+1][p2].se,iki);
if(vec.empty()) bir=-1;
else bir=vec.back();
if(iki<r) bir=r;
c.pb(b[p2++]);
}
else{
int deg=ar[a[p1].se].fi;
if(c.empty()){
if(deg>l){
FORE(i,l,deg){
vec.pb(i);
}
}
}
else{
int once=c.back().fi;
if(deg>once){
FORE(i,once+1,deg){
vec.pb(i);
}
}
else{
while(!vec.empty() and vec.back()>=deg) vec.pop_back();
}
}
iki=max(pref[nd*2][p1].se,iki);
if(vec.empty()) bir=-1;
else bir=vec.back();
if(iki<r) bir=r;
c.pb(a[p1++]);
}
pref[nd].pb({bir,iki});
}
}
void build(int nd=1,int l=1,int r=n){
if(l==r){
int bir,iki;
bir=l;
iki=-1;
for(auto el:tut[l]){
t[nd].pb(el);
bir=-1;
iki=max(iki,el.fi);
pref[nd].pb({bir,iki});
}
return;
}
build(nd*2,l,mid);
build(nd*2+1,mid+1,r);
merge(t[nd],t[nd*2],t[nd*2+1],nd,l,r);
}
vector<pair<pii,int>> segt;
void query(int ql,int qr,int nd=1,int l=1,int r=n){
if(l>r or l>qr or r<ql) return;
pii res;
if(ql<=l and r<=qr){
segt.pb({{l,r},nd});
return;
}
query(ql,qr,nd*2,l,mid);
query(ql,qr,nd*2+1,mid+1,r);
}
bool mm(pii a,pii b){
return a.se<b.se;
}
bool solve(int ql,int qr){
int iki=-1;
FOR(i,segt.size()){
int nd=segt[i].se;
int l=segt[i].fi.fi;
int r=segt[i].fi.se;
if(t[nd].empty()){
if(iki < r) return false;
}
else{
pii pp={qr,INF};
auto it=upper_bound(all(t[nd]),pp);
if(it==t[nd].begin()){
if(iki < r) return false;
}
it--;
int ind=it-t[nd].begin();
if(pref[nd][ind].fi!=-1 and iki < pref[nd][ind].fi) return false;
iki=max(iki,pref[nd][ind].se);
}
}
if(iki<qr) return false;
return true;
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m>>q;
ar.resize(m+1);
FORE(i,1,m+1){
cin>>ar[i].fi>>ar[i].se;
}
sort(all(ar),mm);
FORE(i,1,m+1) tut[ar[i].fi].pb({ar[i].se,i});
build();
while(q--){
int l,r;
cin>>l>>r;
segt.clear();
query(l,r);
if(solve(l,r)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |