求调
查看原帖
求调
819212
_fewq楼主2024/7/8 10:16

只过了样例和 Subtask #1

#include <bits/stdc++.h>
using namespace std;
const int N=2e4+114;
typedef pair<int,int> pint;
int n,q,w[N],b[N],idx[N],lans;
vector<pint> lsh;
struct Sgt{
	int ls,rs,l,r,sum,lmx,rmx;
}a[N<<5];
#define mid ((a[i].l+a[i].r)>>1)
int Sgtl;
inline int new_Sgt(int l,int r){++Sgtl,a[Sgtl].l=l,a[Sgtl].r=r;return Sgtl;}
inline int new_Sgt(int i){a[++Sgtl]=a[i];return Sgtl;}
void push_up(int i){
	a[i].sum=a[a[i].ls].sum+a[a[i].rs].sum;
	a[i].lmx=max(a[a[i].ls].lmx,a[a[i].ls].sum+a[a[i].rs].lmx);
	a[i].rmx=max(a[a[i].ls].rmx+a[a[i].rs].sum,a[a[i].rs].rmx);
}
void build(int i){
	a[i].sum=a[i].lmx=a[i].rmx=a[i].r-a[i].l+1;
	if(a[i].l==a[i].r) return;
	build(a[i].ls=new_Sgt(a[i].l,mid));
	build(a[i].rs=new_Sgt(mid+1,a[i].r));
}
void modify(int i,int p,int x){
	if(a[i].l==a[i].r){a[i].sum=x,a[i].lmx=a[i].rmx=max(0,x);return;}
	modify(mid>=p?(a[i].ls=new_Sgt(a[i].ls)):(a[i].rs=new_Sgt(a[i].rs)),p,x);
	push_up(i);
}
int qsum(int i,int l,int r){
	if(a[i].l>=l && a[i].r<=r) return a[i].sum;
	if(mid>=l) return mid<r?qsum(a[i].ls,l,r)+qsum(a[i].rs,l,r):qsum(a[i].ls,l,r);
	return qsum(a[i].rs,l,r);
}
pint qlmx(int i,int l,int r){
	if(a[i].l>=l && a[i].r<=r) return pint(a[i].sum,a[i].lmx);
	if(mid>=l){
		if(mid<r){
			pint t1=qlmx(a[i].ls,l,r),t2=qlmx(a[i].rs,l,r);
			return pint(t1.first+t2.first,max(t1.second,t2.first+t2.second));
		}
		return qlmx(a[i].ls,l,r);
	}
	return qlmx(a[i].rs,l,r);
}
pint qrmx(int i,int l,int r){
	if(a[i].l>=l && a[i].r<=r) return pint(a[i].sum,a[i].rmx);
	if(mid>=l){
		if(mid<r){
			pint t1=qrmx(a[i].ls,l,r),t2=qrmx(a[i].rs,l,r);
			return pint(t1.first+t2.first,max(t1.second+t2.first,t2.second));
		}
		return qrmx(a[i].ls,l,r);
	}
	return qrmx(a[i].rs,l,r);
}
#undef mid
int rt[N];
signed main(){
	std::ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	for(int i=1;i<=n;++i) cin >> w[i];
	lsh.resize(n+1);
	for(int i=1;i<=n;++i) lsh[i]=pint(w[i],i);
	sort(lsh.begin(),lsh.end());
	for(int i=1;i<=n;++i) b[lsh[i].second]=i,idx[i]=lsh[i].second;
	build(rt[1]=new_Sgt(1,n));
	for(int i=2;i<=n;++i) modify(rt[i]=new_Sgt(rt[i-1]),idx[i-1],-1);
	cin >> q;
	while(q--){
		int l1,r1,l2,r2;
		cin >> l1 >> r1 >> l2 >> r2;
		l1=(l1+lans)%n+1,r1=(r1+lans)%n+1,l2=(l2+lans)%n+1,r2=(r2+lans)%n+1;
		if(l1>r1) swap(l1,r1);
		if(l1>l2) swap(l1,l2);
		if(l1>r2) swap(l1,r2);
		if(r1>l2) swap(r1,l2);
		if(r1>r2) swap(r1,r2);
		if(l2>r2) swap(l2,r2);
		int l=1,r=n;
		while(l<r){
			int mid=l+r+1>>1;
			if(qrmx(rt[mid],l1,r1-1).second+qsum(rt[mid],r1,l2)+qlmx(rt[mid],l2+1,r2).second>=0) l=mid;
			else r=mid-1;
		}
		cout << (lans=w[idx[l]]) << '\n';
	}
	return 0;
}
2024/7/8 10:16
加载中...