#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#define INF make_pair((int)1e9,0)
using namespace std;
const int MAXN=500005;
struct Segtree{
vector<vector<int>> root;
int N;
void build(int _N){
root.resize(4*_N);
this->N=_N;
}
void update(int start,int end,int L,int R,int node){
if(L==R){
root[node].emplace_back(end);
return;
}
int mid=(L+R)/2;
if(start<=mid) update(start,end,L,mid,node*2);
else update(start,end,mid+1,R,node*2+1);
}
void update_all(int L,int R,int node){
if(L==R) return;
int mid=(L+R)/2;
update_all(L,mid,node*2);
update_all(mid+1,R,node*2+1);
int itL=0,itR=0,LN=node*2,RN=LN+1;
while(itL<root[LN].size()&&itR<root[RN].size()){
if(root[LN][itL]<=root[RN][itR]){
root[node].emplace_back(root[LN][itL++]);
if(root[LN][itL]==root[RN][itR]) itR++;
}
else if(root[node].empty()||root[node].back()<=mid) itR++;
else root[node].emplace_back(root[RN][itR++]);
}
while(itL<root[LN].size()) root[node].emplace_back(root[LN][itL++]);
while(!root[node].empty()&&root[node].back()>mid&&itR<root[RN].size())
root[node].emplace_back(root[RN][itR++]);
}
pair<int,int> query(int start,int end,int L,int R,int node){
if(R<start||L>end) return INF;
if(start<=L&&R<=end){
if(root[node].empty()) return INF;
auto it=upper_bound(root[node].begin(),root[node].end(),end);
return (it==root[node].begin())?INF:make_pair(L,*prev(it));
}
int mid=(L+R)/2;
auto AnsL=query(start,end,L,mid,node*2);
auto AnsR=query(start,end,mid+1,R,node*2+1);
if(AnsL==INF) return AnsR;
if(AnsR==INF) return AnsL;
return (AnsR.first>AnsL.second)?INF:make_pair(AnsL.first,AnsR.second);
}
void update_test(int start,int end){
update(start,end,1,N,1);
}
bool query_test(int start,int end){
return make_pair(start,end)==query(start,end,1,N,1);
}
} Tree;
vector<pair<int,int>> tmp;
int n,m,k;
int a,b;
signed main(){
cin.tie(0)->sync_with_stdio(0);
cin >> n >> m >> k;
Tree.build(n+1);
for(int i=0;i<m;i++){
cin >> a >> b;
tmp.emplace_back(a,b+1);
}
sort(tmp.begin(),tmp.end());
for(int i=0;i<m;i++) Tree.update_test(tmp[i].first,tmp[i].second);
Tree.update_all(1,n+1,1);
for(int i=0;i<k;i++) cin >> a >> b,cout << (Tree.query_test(a,b+1)?"YES\n":"NO\n");
return 0;
}
/*
8 2 1
1 2
3 4
1 4
*/
# | 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... |