主席树只过了Sub#1求调,玄关
查看原帖
主席树只过了Sub#1求调,玄关
608740
Feather_Moon楼主2025/7/31 16:00
#include<bits/stdc++.h>
#define int long long
const int N=5e4+5;
using namespace std;
int read(){
	int ret=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
	while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();
	return ret*f;
}
void write(int x){
	if(x<0)x=-x,putchar('-');
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
int n,m,q;
int a[N];
struct anth{
	int x;int id;
	bool operator <(const anth &B)const{return x<B.x;}
}b[N];
map<int,int> hsh;
map<int,int> mp;
struct node{
	int sum;
	int pre,suf;
}tree[N<<5];
int vt[N<<2],tot,lst;
int ls[N<<5],rs[N<<5];
void push_up(int x){
	tree[x].sum=tree[ls[x]].sum+tree[ls[x]].sum;
	tree[x].pre=max(tree[ls[x]].pre,tree[ls[x]].sum+tree[rs[x]].pre);
	tree[x].suf=max(tree[rs[x]].suf,tree[rs[x]].suf+tree[ls[x]].suf);
}
void build(int &x,int l,int r){
	x=++tot;if(l==r){tree[x]=(node){1,1,1};return;}
	int mid=(l+r)/2;
	build(ls[x],l,mid);
	build(rs[x],mid+1,r);
	push_up(x);
}
int update(int x,int l,int r,int v){
	int now_x=++tot;
	tree[now_x]=tree[x];ls[now_x]=ls[x];rs[now_x]=rs[x];
	if(l==r){tree[now_x]=(node){-1,0,0};return now_x;}
	int mid=(l+r)/2;
	if(v<=mid)ls[now_x]=update(ls[now_x],l,mid,v);
	if(v >mid)rs[now_x]=update(rs[now_x],mid+1,r,v);
	push_up(now_x);return now_x;
}
int query_sum(int x,int l,int r,int L,int R){
	if(L>R)return 0;
	if(L<=l && r<=R)return tree[x].sum;
	int mid=(l+r)/2,ret=0;
	if(L<=mid)ret+=query_sum(ls[x],l,mid,L,R);
	if(R> mid)ret+=query_sum(rs[x],mid+1,r,L,R);
	return ret;
}
struct pir1{int pre,sum;};
pir1 query_pre(int x,int l,int r,int L,int R){
	if(L<=l && r<=R)return (pir1){tree[x].pre,tree[x].sum};
	int mid=(l+r)/2;
	if(L> mid)return query_pre(rs[x],mid+1,r,L,R);
	if(R<=mid)return query_pre(ls[x],l,mid,L,R);
	pir1 A=query_pre(ls[x],l,mid,L,R);
	pir1 B=query_pre(rs[x],mid+1,r,L,R);
	return (pir1){max(A.pre,A.sum+B.pre),A.sum+B.sum};
}
struct pir2{int suf,sum;};
pir2 query_suf(int x,int l,int r,int L,int R){
	if(L<=l && r<=R)return (pir2){tree[x].suf,tree[x].sum};
	int mid=(l+r)/2;
	if(L> mid)return query_suf(rs[x],mid+1,r,L,R);
	if(R<=mid)return query_suf(ls[x],l,mid,L,R);
	pir2 A=query_suf(ls[x],l,mid,L,R);
	pir2 B=query_suf(rs[x],mid+1,r,L,R);
	return (pir2){max(B.suf,B.sum+A.suf),A.sum+B.sum};
}
bool check(int x,int A,int B,int C,int D){
	int ret=query_suf(vt[x],1,n,A,B-1).suf+query_sum(vt[x],1,n,B,C)+query_pre(vt[x],1,n,C+1,D).pre;
	return (ret>=0);
}
signed main(){
	n=read();
	for(int i=1;i<=n;i++)b[i]=(anth){a[i]=read(),i};
	sort(b+1,b+1+n);build(vt[0],1,n);lst=0;
	for(int i=1;i<=n;i++){
		if(i==1||b[i].x!=b[i-1].x)hsh[b[i].x]=++m,mp[m]=b[i].x;
		vt[m]=update(vt[lst],1,n,b[i].id);lst=m;
	}
	q=read();lst=0;
	while(q--){
		int p[4];
		for(int i=0;i<4;i++)p[i]=(read()+lst)%n+1;
		sort(p,p+4);
		int A=p[0],B=p[1],C=p[2],D=p[3];
		int l=0,r=m,mid;
		while(l<=r){
			mid=(l+r)/2;
			if(check(mid,A,B,C,D))l=mid+1;
			else r=mid-1;
		}
		write(lst=mp[r+1]);putchar('\n');
	}
	return 0;
}

马蜂出奇的丑勿喷。

2025/7/31 16:00
加载中...