Submission #1184762

#TimeUsernameProblemLanguageResultExecution timeMemory
1184762elotelo966Curtains (NOI23_curtains)C++20
20 / 100
506 ms72448 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define OYY LLONG_MAX
#define faster ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define fi first
#define se second
#define FOR for(int i=1;i<=n;i++)
#define mid (start+end)/2
#define pb push_back
#define lim 500005

const int mod=1000000007;

int n,m,q,cur_cev;

int curtains[lim][2];

int dizi[lim][2];

int tree[4*lim],lazy[4*lim][2];

bool cev[lim];

vector<pair<int,pair<int,pair<int,int>>>> v;

inline void build(int node,int start,int end){
	if(start==end){
		tree[node]=start-1;
		return ;
	}
	build(node*2,start,mid),build(node*2+1,mid+1,end);
}

inline void merge(int node,int start,int end,int x,int y){
	if(lazy[node][0]==0 || lazy[node][1]<x-1){
		lazy[node][0]=x;
		lazy[node][1]=y;
	}
	else{
		lazy[node][0]=min(lazy[node][0],x);
		lazy[node][1]=y;
	}
}

inline void push(int node,int start,int end){
	if(lazy[node][0]==0)return;
	if(start==end){
		if(tree[node]>=lazy[node][0]-1)tree[node]=lazy[node][1];
	}
	else{
		merge(node*2,start,mid,lazy[node][0],lazy[node][1]);
		merge(node*2+1,mid+1,end,lazy[node][0],lazy[node][1]);
	}
	lazy[node][0]=lazy[node][1]=0;
}

inline void update(int node,int start,int end,int l,int r,int x,int y){
	push(node,start,end);
	if(start>end || start>r || end<l)return ;
	if(start>=l && end<=r){
		lazy[node][0]=x;
		lazy[node][1]=y;
		return ;
	}
	update(node*2,start,mid,l,r,x,y),update(node*2+1,mid+1,end,l,r,x,y);
}

inline void query(int node,int start,int end,int l,int r){
	if(start>end || start>r || end<l || ~cur_cev)return ;
	push(node,start,end);
	if(start>=l && end<=r){
		cur_cev=tree[node];
		return;
	}
	query(node*2,start,mid,l,r),query(node*2+1,mid+1,end,l,r);
}

inline void debug(int node,int start,int end){
	cout<<node<<" "<<start<<" "<<end<<" "<<tree[node]<<" "<<lazy[node][0]<<" "<<lazy[node][1]<<endl;
	if(start==end){
		return ;
	}
	debug(node*2,start,mid),debug(node*2+1,mid+1,end);
}

int32_t main(){
	faster
	cin>>n>>m>>q;
	for(int i=1;i<=m;i++){
		cin>>curtains[i][0]>>curtains[i][1];
		v.pb({curtains[i][1],{0,{curtains[i][0],i}}});
	}
	
	for(int i=1;i<=q;i++){
		cin>>dizi[i][0]>>dizi[i][1];
		v.pb({dizi[i][1],{1,{dizi[i][0],i}}});
	}
	
	sort(v.begin(),v.end());
	
	build(1,1,n);
	
	for(auto a:v){
		int r=a.fi,kim=a.se.fi,l=a.se.se.fi,ind=a.se.se.se;
		//cout<<l<<" "<<r<<" "<<kim<<endl;
		if(kim){
			cur_cev=-1;
			query(1,1,n,l,l);
			if(cur_cev==r)cev[ind]=1;
			else cev[ind]=0;
		}
		else{
			update(1,1,n,1,l,l,r);
		}
		//debug(1,1,n);
	}
	
	for(int i=1;i<=q;i++){
		if(cev[i])cout<<"YES"<<'\n';
		else cout<<"NO"<<'\n';
	}
	
	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...