做法是对的,但T的有点多。。。
#include<bits/stdc++.h>
#define sd std::
#define int long long
#define inf 0x3f3f3f3f
#define linf 1e18
#define il inline
#define db double
#define ldb long double
#define F(i,a,b) for(int i=(a);i<=(b);i++)
#define f(i,a,b) for(int i=(a);i>=(b);i--)
#define MIN(x,y) (x<y?x:y)
#define MAX(x,y) (x>y?x:y)
#define me(x,y) memset(x,y,sizeof x)
#define pii sd pair<int,int>
#define umap(x,y) sd unordered_map<x,y>
#define pque(x) sd priority_queue<x>
#define X first
#define Y second
#define kg putchar(' ')
#define Fr(a) for(auto it:a)
#define dbg(x) sd cout<<#x<<": "<<x<<sd endl
il int read(){int w=1,c=0;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) c=(c<<3)+(c<<1)+ch-48;return w*c;}
void printt(int x){if(x>9) printt(x/10);putchar(x%10+48);}
il void print(int x){if(x<0) putchar('-'),printt(-x);else printt(x);}
il void put(int x){print(x);putchar('\n');}
il void printk(int x){print(x);kg;}
const int N=2e4+10;
int n,q,a[N],b[N];//bÊý×éÀëÉ¢»¯
struct node
{
int val;//Çø¼äºÍ
int lans;//×î´óǰ׺ºÍ
int rans;//×î´óºó׺ºÍ
int l,r;
}t[N<<6];//ȨֵÖ÷ϯÊ÷
#define l(k) t[k].l
#define r(k) t[k].r
#define val(k) t[k].val
#define la(k) t[k].lans
#define ra(k) t[k].rans
int root[N],tot;
sd vector<int> v[N];//¼ÇÂ¼ÖØ¸´
int newly(int k)
{
return t[++tot]=t[k],tot;
}
void pushup(int k)
{
val(k)=val(l(k))+val(r(k));
la(k)=MAX(la(l(k)),val(l(k))+la(r(k)));
ra(k)=MAX(ra(r(k)),val(r(k))+ra(l(k)));
}
void update(int &k,int l,int r,int x,int v)
{
k=newly(k);
if(l==r&&x==l)
{
val(k)=v;
if(v>0) la(k)=ra(k)=v;
return;
}
int mid=l+r>>1;
if(x<=mid) update(l(k),l,mid,x,v);
else update(r(k),mid+1,r,x,v);
pushup(k);
}
//int que_val(int k,int l,int r,int x,int y)
//{
// if(x<=l&&y>=r) return val(k);
// if(x>r||y<l) return 0;
// int mid=l+r>>1;
// return que_val(l(k),l,mid,x,y)+que_val(r(k),mid+1,r,x,y);
//}
int que_val(int k,int l,int r,int x,int y) {
if(y<l||r<x) {
return 0;
}
if(x<=l&&r<=y) {
return val(k);
}
int mid=l+r>>1,ans=0;
if(x<=mid) {
ans+=que_val(l(k),l,mid,x,y);
}
if(y>mid) {
ans+=que_val(r(k),mid+1,r,x,y);
}
return ans;
}
int que_lans(int k,int l,int r,int x,int y)
{
if(x<=l&&y>=r) return la(k);
if(x>r||y<l) return 0;
int mid=l+r>>1;
return MAX(que_val(l(k),l,mid,x,y)+que_lans(r(k),mid+1,r,x,y),que_lans(l(k),l,mid,x,y));
}
int que_rans(int k,int l,int r,int x,int y)
{
if(x<=l&&y>=r) return ra(k);
if(x>r||y<l) return 0;
int mid=l+r>>1;
return MAX(que_val(r(k),mid+1,r,x,y)+que_rans(l(k),l,mid,x,y),que_rans(r(k),mid+1,r,x,y));
}
bool check(int mid,int A,int B,int C,int D)
{
int t1=0,t2=0,t3=0;
t1=que_val(root[mid],1,n,B,C);
t2=que_rans(root[mid],1,n,A,B-1);//this
t3=que_lans(root[mid],1,n,C+1,D);//this
return t1+t2+t3>=0;
}
int p;
il void discre()//ÀëÉ¢»¯
{
sd sort(b+1,b+1+n);
p=sd unique(b+1,b+1+n)-b-1;
F(i,1,n) a[i]=sd lower_bound(b+1,b+1+p,a[i])-b,v[a[i]].emplace_back(i);
}
int tmp[10];
il void solve()
{
n=read();
F(i,1,n) a[i]=b[i]=read();
discre();
F(i,1,n) update(root[p+1],1,n,i,-1);
f(i,p,1)
{
root[i]=root[i+1];
int len=v[i].size();
F(j,0,len-1) update(root[i],1,n,v[i][j],1);
}
int last=0,A,B,C,D;
q=read();
while(q--)
{
tmp[1]=(read()+last)%n,tmp[2]=(read()+last)%n,tmp[3]=(read()+last)%n,tmp[4]=(read()+last)%n;
sd sort(tmp+1,tmp+5);
A=tmp[1]+1,B=tmp[2]+1,C=tmp[3]+1,D=tmp[4]+1;
int l=1,r=p+1,ans;
while(l<=r)
{
int mid=l+r>>1;
if(check(mid,A,B,C,D)) l=mid+1,ans=mid;
else r=mid-1;
}
put(last=b[ans]);
}
}
signed main()
{
int T=1;
// T=read();
while(T--) solve();
return 0;
}