제출 #1346830

#제출 시각아이디문제언어결과실행 시간메모리
1346830kokoxuyaGift Exchange (JOI24_ho_t4)C++20
50 / 100
248 ms75248 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define mp make_pair
#define lsb(x) (x&(-x))
#define pii pair<int,int>
#define ss second
#define ff first
#define piii pair<int,pii>
#define debu(x) (cerr << #x  << " = "<< x << "\n")
#define debu2(x,y) (cerr << #x  << " = "<< x << " " << #y << " = " << y << "\n")
#define debu3(x,y,z) (cerr << #x  << " = "<< x << " " << #y << " = " << y << " " << #z << " = " << z<< "\n")
#define bitout(x,y) {\
	cerr << #x << " : ";\
	for (int justforbits = y; justforbits >=0; justforbits--)cout << (((1 << justforbits) & x)>=1);\
	cout << "\n";\
}
#define rangeout(j,rangestart,rangeend) {\
	cerr << "outputting " << #j<< ":\n";\
	for (int forrang = rangestart; forrang <= rangeend; forrang++)cerr << j[forrang] << " ";\
	cerr<<"\n";\
}
#define c1 {cerr << "Checkpoint 1! \n\n";cerr.flush();}
#define c2 {cerr << "Checkpoint 2! \n\n";cerr.flush();}
#define c3 {cerr << "Checkpoint 3! \n\n";cerr.flush();}
#define c4 {cerr << "Checkpoint 4! \n\n";cerr.flush();}
#define defN 1000001
//omigyatt i need to stop naming 2 different variables the same name rgwbrog
//jfwbubf since uyr going backwards also remember to put the numbers in vector[n-i] instedad of vector [i] fqweo nweonwe n

vector<int>sg(4*defN,0);
vector<int>lazy(4*defN,0);

int query(int s, int e, int cn, int reqs, int reqe)
{
	if(reqs<=s&&reqe>=e)
	{
		return sg[cn];
	}
	
	int ans=0;
	int m=(s+e)/2;
	if(reqs<=m)
	{
		ans=query(s,m,cn<<1,reqs,reqe);
	}
	if(reqe>m)
	{
		ans=max(ans,query(m+1,e,(cn<<1)|1,reqs,reqe));
	}
	return ans;
}

void update(int s, int e, int cn, int pos, int val)
{
	if(s==e)
	{
		sg[cn]=val;
		return;
	}
	
	int m=(s+e)/2;
	if(pos<=m)
	{
		update(s,m,cn<<1,pos,val);
	}
	else
	{
		update(m+1,e,(cn<<1)|1,pos,val);
	}
	
	sg[cn]=max(sg[cn<<1],sg[(cn<<1)|1]);
}

void init(int s, int e, int cn, vector<int>&corrs)
{
	if(s==e)
	{
		sg[cn]=corrs[s];return;
	}
	
	int m=(s+e)/2;
	init(s,m,cn<<1,corrs);
	init(m+1,e,(cn<<1)|1,corrs);
	sg[cn]=max(sg[cn<<1],sg[(cn<<1)|1]);
}

void rangedate(int s, int e, int cn, int reqs, int reqe, int val)
{
	if(reqs<=s&&reqe>=e)
	{
		//debu3(s,e,val);
		lazy[cn]=max(lazy[cn],val);
		return;;
	}
	
	int m=(s+e)/2;
	if(reqs<=m)
	{
		rangedate(s,m,cn<<1,reqs,reqe,val);
	}
	if(reqe>m)
	{
		rangedate(m+1,e,(cn<<1)|1,reqs,reqe,val);
	}
}

int querpoint(int s, int e, int cn, int pos)
{
	if(s==e)
	{
		return lazy[cn];
	}
	
	int ans=lazy[cn];//debu(ans);
	int m=(s+e)/2;
	if(pos<=m){return max(ans,querpoint(s,m,cn<<1,pos));}
	else{return max(ans,querpoint(m+1,e,(cn<<1)|1,pos));}
}

signed main()
{
    int t1,t2,t3,t4;
    mt19937_64 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	
	int n;cin>>n;
	vector<pii>ppl(n+1);
	
	for(int a=1;a<=n;a++){cin>>ppl[a].ss;}
	for(int a=1;a<=n;a++){cin>>ppl[a].ff;}
	
	int n2=2*n;
	vector<vector<int>>corrs(2,vector<int>(n+1));
	vector<int>rtonum(n2+1);
	
	for(int i=1;i<=n;i++){rtonum[ppl[i].ss]=i;}
	
	for(int a=0;a<2;a++)
	{
		for(int i=1;i<=n;i++)
		{
			int l,r;tie(l,r)=ppl[i];
			t1=query(1,n2,1,l,r);
			t2=querpoint(1,n2,1,r);//debu(t2);
			update(1,n2,1,r,i);
			rangedate(1,n2,1,l,r,i);
			//debu3(l,r,i);
			corrs[a][a?n-i+1:i]=max(t1,t2);
			//debu2(a,i);debu(corrs[a][i]);
		}
		
		if(a==0)
		{
			reverse(ppl.begin()+1,ppl.end());
			fill(sg.begin(),sg.end(),0);
			fill(lazy.begin(),lazy.end(),0);
		}
	}
	
	priority_queue<pii>pq;
	for(int a=1;a<=n;a++)
	{
		corrs[1][a]=n-corrs[1][a]+1;
		pq.push(mp(corrs[0][a],a));
	}
	
	/*for(int a=1;a<=n;a++)
	{
		debu2(corrs[0][a],corrs[1][a]);
	}*/
	
	init(1,n,1,corrs[1]);
	
	int q;cin>>q;
	vector<piii>queries;
	
	int kyoo=q;
	while(q--)
	{
		cin>>t1>>t2;
		queries.pb(mp(t1,mp(t2,kyoo-q)));
	}
	sort(queries.begin(),queries.end(),greater<piii>());
	
	vector<bool>ans(n+1);
	
	for(piii qq:queries)
	{
		while(!pq.empty()&&pq.top().ff>=qq.ff)
		{
			update(1,n,1,pq.top().ss,0);
			pq.pop();
		}
		
		t1=query(1,n,1,qq.ff,qq.ss.ff);
		ans[qq.ss.ss]=(t1>qq.ss.ff)?false:true;
	}
	
	for(int i=1;i<=kyoo;i++)
	{
		if(ans[i])cout<<"Yes\n";
		else cout<<"No\n";
	}
}


#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...