记录编号 157579 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队2012]middle 最终得分 100
用户昵称 Gravatar真呆菌 是否通过 通过
代码语言 C++ 运行时间 16.395 s
提交时间 2015-04-09 14:43:35 内存使用 13.64 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<cstring>
#define l(x) T[x].lc
#define r(x) T[x].rc
#define lx(x) T[x].lx
#define rx(x) T[x].rx
#define sx(x) T[x].sx
using namespace std;
const int N = 20010;
struct SegTree{
	int lx,rx,lc,rc,sx;}T[N*30];
struct Seq{
	int x,id;}A[N];
int n,m,tot,root[N];

bool Cmp(const Seq &a,const Seq&b){
	if(a.x<b.x) return 1;
	return 0;
}

int Max(int x,int y){if(x>y) return x;return y;}

SegTree Link(SegTree a,SegTree b){
	SegTree t=(SegTree){0,0,0,0,0};
	t.sx=a.sx+b.sx;
	t.lx=Max(a.lx,a.sx+b.lx);
	t.rx=Max(b.rx,b.sx+a.rx);
	return t;
}

void Update(int x){
	sx(x)=sx(l(x))+sx(r(x));
	lx(x)=Max(lx(l(x)),sx(l(x))+lx(r(x)));
	rx(x)=Max(rx(r(x)),sx(r(x))+rx(l(x)));
	return;
}

int Build(int l,int r){
	int now=++tot,mid;
	if(l==r){
		lx(now)=rx(now)=sx(now)=1;
		return now;
	}
	mid=(l+r)>>1;
	l(now)=Build(l,mid);
	r(now)=Build(mid+1,r);
	Update(now);
	return now;
}

int Change(int x,int l,int r,int a){
	int now=++tot,mid;T[now]=T[x];
	if(l==r){sx(now)=-1;lx(now)=0;rx(now)=0;return now;}
	mid=(l+r)>>1;
	if(a<=mid) l(now)=Change(l(x),l,mid,a);
	else r(now)=Change(r(x),mid+1,r,a);
	Update(now);
	return now;
}

int TQuery(int x,int l,int r,int L,int R){
	if(l>=L&&r<=R) return sx(x);
	int res=0,mid=(l+r)>>1;
	if(L<=mid) res+=TQuery(l(x),l,mid,L,R);
	if(R>mid) res+=TQuery(r(x),mid+1,r,L,R);
	return res;
}

int LQuery(int x,int l,int r,int L,int R){
	if(l>=L&&r<=R) return lx(x);
	int mid=(l+r)>>1;
	if(R<=mid) return LQuery(l(x),l,mid,L,R);
	else if(L>mid) return LQuery(r(x),mid+1,r,L,R);
	else return Max(LQuery(l(x),l,mid,L,R),TQuery(l(x),l,mid,L,R)+LQuery(r(x),mid+1,r,L,R));
}

int RQuery(int x,int l,int r,int L,int R){
	if(l>=L&&r<=R) return rx(x);
	int mid=(l+r)>>1;
	if(R<=mid) return RQuery(l(x),l,mid,L,R);
	else if(L>mid) return RQuery(r(x),mid+1,r,L,R);
	else return Max(RQuery(r(x),mid+1,r,L,R),TQuery(r(x),mid+1,r,L,R)+RQuery(l(x),l,mid,L,R));
}

SegTree TTQuery(int x,int l,int r,int L,int R){
	if(l>=L&&r<=R) return T[x];
	int mid=(l+r)>>1;
	if(R<=mid) return TTQuery(l(x),l,mid,L,R);
	else if(L>mid) return TTQuery(r(x),mid+1,r,L,R);
	return Link(TTQuery(l(x),l,mid,L,R),TTQuery(r(x),mid+1,r,L,R));
}

bool Check(int x,int a,int b,int c,int d){
	int res=0;
	res+=TTQuery(root[x],1,n,b,c).sx;
	res+=TTQuery(root[x],1,n,a,b-1).rx;
	res+=TTQuery(root[x],1,n,c+1,d).lx;
	if(res>=0) return 1;
	return 0;
}

int Query(int a,int b,int c,int d){
	int l=1,r=n,mid;
	while(r-l>1){
		mid=(l+r)>>1;
		if(Check(mid,a,b,c,d)==1) l=mid;
		else r=mid;
	}
	if(Check(r,a,b,c,d)==1) return r;
  	return l;
}

void Paint(int x,int l,int r){
	if(l==r) {printf("%d ",sx(x));return;}
	Paint(l(x),l,(l+r)>>1),Paint(r(x),((l+r)>>1)+1,r);
	return;
}

int main(){
	#define Read
	#ifdef Read
		freopen("nt2012_middle.in","r",stdin);
		freopen("nt2012_middle.out","w",stdout);
	#endif
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&A[i].x);
		A[i].id=i;
	}
	sort(A+1,A+n+1,Cmp);
	root[1]=Build(1,n);
	for(int i=2;i<=n;i++) 
		root[i]=Change(root[i-1],1,n,A[i-1].id);
	scanf("%d",&m);int q[4],ans=0;
	while(m--){
		for(int i=0;i<4;i++) scanf("%d",&q[i]),q[i]=(q[i]+ans)%n+1;
		sort(q,q+4);
		ans=A[Query(q[0],q[1],q[2],q[3])].x;
		printf("%d\n",ans);
	}
	return 0;
}