WA30求调
查看原帖
WA30求调
1417582
De___Bruyne楼主2025/2/3 14:04
//P2839 [国家集训队] middle

#include<bits/stdc++.h>
#define lc(u) tr[u].ls
#define rc(u) tr[u].rs
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int>pii;
const int N=2e4+10;
int n,m,a[N],rt[N],tN;
vector<int>lsh;
vector<int>lct[N]; 

struct Tr{
	int sum,pre,suf,ls,rs;
}tr[N<<6];
int cnt;
void pushup(int u){
	tr[u].sum=tr[lc(u)].sum+tr[rc(u)].sum;
	tr[u].pre=max(tr[lc(u)].pre,tr[lc(u)].sum+tr[rc(u)].pre);
	tr[u].suf=max(tr[rc(u)].suf,tr[rc(u)].sum+tr[lc(u)].suf);
}
void build(int u,int l,int r){
	tr[u]={-1,0,0,0,0};
	if(l==r)return;
	int mid=l+r>>1;
	lc(u)=++cnt;
	rc(u)=++cnt;
	build(lc(u),l,mid);
	build(rc(u),mid+1,r);
	pushup(u);
}
void change(int u,int pu,int loc,int v,int l,int r){
	tr[u]=tr[pu];
	if(l==r&&loc==l){
		tr[u].sum=v;
		if(v>0)tr[u].pre=tr[u].suf=v;
		return;
	}
	int mid=l+r>>1;
	if(loc<=mid){
		tr[u].ls=++cnt;
		change(lc(u),lc(pu),loc,v,l,mid);
	}
	else{
		tr[u].rs=++cnt;
		change(rc(u),rc(pu),loc,v,mid+1,r);
	}
	pushup(u);
}
int qsum(int u,int ql,int qr,int l,int r){
	if(l>=ql&&r<=qr)
		return tr[u].sum;
	if(l>qr||r<ql)return 0;
	int mid=l+r>>1;
	int res=0; 
	if(ql<=mid)res+=qsum(lc(u),ql,qr,l,mid);
	if(qr>mid)res+=qsum(rc(u),ql,qr,mid+1,r);
	return res;
}
int qpre(int u,int ql,int qr,int l,int r){
	if(l>=ql&&r<=qr)return tr[u].pre;
	if(l>qr||r<ql)return 0;
	int mid=l+r>>1;
	return max(qpre(lc(u),ql,qr,l,mid),qsum(lc(u),ql,qr,l,mid)+qpre(rc(u),ql,qr,mid+1,r));
}
int qsuf(int u,int ql,int qr,int l,int r){
	if(l>=ql&&r<=qr)return tr[u].suf;
	if(l>qr||r<ql)return 0;
	int mid=l+r>>1;
	return max(qsuf(rc(u),ql,qr,mid+1,r),qsum(rc(u),ql,qr,mid+1,r)+qsuf(lc(u),ql,qr,l,mid));
}
int fd(int x){
	return lower_bound(lsh.begin(),lsh.end(),x)-lsh.begin();
}
void init(){
	cin>>n;
	lsh.resize(n+1);
	lsh[0]=-1;
	for(int i=1;i<=n;++i)cin>>a[i],lsh[i]=a[i];
	sort(lsh.begin(),lsh.end());
//	for(int i=1;i<lsh.size();++i)cout<<lsh[i]<<' ';
	tN=unique(lsh.begin(),lsh.end())-lsh.begin()-1;
	for(int i=1;i<=n;++i){
		a[i]=fd(a[i]);
		lct[a[i]].emplace_back(i);
	}
}
int q[4];
signed main(){
	ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
	init();
	rt[tN+1]=++cnt;
	build(rt[tN+1],1,n);
	for(int i=tN;i;--i){
		rt[i]=++cnt;
		for(int j=0;j<lct[i].size();++j){
			change(rt[i],rt[i+1],lct[i][j],1,1,n);
		}
	}
	cin>>m;
	int ans=0,a,b,c,d;
	for(int i=1;i<=m;++i){
		cin>>a>>b>>c>>d;
		q[0]=(a+ans)%n;q[1]=(b+ans)%n;q[2]=(c+ans)%n;q[3]=(d+ans)%n;
		sort(q,q+4);
		a=q[0]+1;b=q[1]+1;c=q[2]+1;d=q[3]+1;
		int midans,lans,rans,mid,l=1,r=tN;
		while(l<r){
			mid=l+r+1>>1;
			midans=qsum(rt[mid],b,c,1,n);
			lans=qsuf(rt[mid],a,b-1,1,n);
			rans=qpre(rt[mid],c+1,d,1,n);
//			cout<<"mid is: "<<lsh[mid]<<' '<<lans<<' '<<midans<<' '<<rans<<endl;
			if(midans+lans+rans>=0)l=mid;
			else r=mid-1;
		}
		ans=lsh[l];
		cout<<ans<<'\n';
	}
	return 0;
}
2025/2/3 14:04
加载中...