调了一天了,调崩了。
只能过 #1 到 #7。
#include <bits/stdc++.h>
#define re register
using namespace std;
const int N = 2e4 + 10,inf = 1e9 + 10;
int n,m,q,lst;
int A,B,C,D;
int Q[10],rt[N],arr[N];
vector<int> p,v[N];
inline int read(){
int r = 0,w = 1;
char c = getchar();
while (c < '0' || c > '9'){
if (c == '-') w = -1;
c = getchar();
}
while (c >= '0' && c <= '9'){
r = (r << 3) + (r << 1) + (c ^ 48);
c = getchar();
}
return r * w;
}
struct PST{
#define ls(u) (tr[u].l)
#define rs(u) (tr[u].r)
int idx;
struct node{
int l,r;
int sum,lmax,rmax;
}tr[N << 5];
node friend operator +(const node &a,const node &b){
node res;
res.sum = a.sum + b.sum;
res.lmax = max(a.lmax,a.sum + b.lmax);
res.rmax = max(b.rmax,a.rmax + b.sum);
return res;
}
inline void pushup(int u){
node res = tr[ls(u)] + tr[rs(u)];
tr[u].sum = res.sum;
tr[u].lmax = res.lmax;
tr[u].rmax = res.rmax;
}
inline int build(int l,int r){
int u = ++idx;
if (l == r){
tr[u].sum = tr[u].lmax = tr[u].rmax = 1;
return u;
}
int mid = l + r >> 1;
tr[u] = {build(l,mid),build(mid + 1,r)};
pushup(u);
return u;
}
inline int insert(int u,int l,int r,int k){
int p = ++idx;
tr[p] = tr[u];
if (l == r){
tr[p].sum = tr[p].lmax = tr[p].rmax = -1;
return p;
}
int mid = l + r >> 1;
if (k <= mid) ls(p) = insert(ls(u),l,mid,k);
else rs(p) = insert(rs(u),mid + 1,r,k);
pushup(p);
return p;
}
inline node query(int u,int l,int r,int ql,int qr){
if (ql <= l && r <= qr) return tr[u];
node res = {0,0,0,-inf,-inf};
int mid = l + r >> 1;
if (ql <= mid) res = res + query(ls(u),l,mid,ql,qr);
if (qr > mid) res = res + query(rs(u),mid + 1,r,ql,qr);
return res;
}
#undef ls
#undef rs
}T;
inline bool check(int x){
int sum = 0;
if (C - B > 1) sum = T.query(rt[x],1,n,B + 1,C - 1).sum;
sum += T.query(rt[x],1,n,A,B).rmax + T.query(rt[x],1,n,C,D).lmax;
return (sum >= 0);
}
int main(){
n = read();
for (re int i = 1;i <= n;i++){
arr[i] = read();
p.push_back(arr[i]);
}
sort(p.begin(),p.end());
p.erase(unique(p.begin(),p.end()),p.end());
m = p.size();
for (re int i = 1;i <= n;i++){
arr[i] = lower_bound(p.begin(),p.end(),arr[i]) - p.begin() + 1;
v[arr[i]].push_back(i);
}
rt[0] = T.build(1,n);
for (re int i = 1;i <= m;i++){
rt[i] = rt[i - 1];
for (auto it:v[i]) rt[i] = T.insert(rt[i - 1],1,n,it);
}
q = read();
while (q--){
for (re int i = 0;i < 4;i++) Q[i] = (read() + lst) % n + 1;
sort(Q,Q + 4);
A = Q[0],B = Q[1],C = Q[2],D = Q[3];
int l = 1,r = m;
while (l < r){
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
lst = p[l];
printf("%d\n",lst);
}
return 0;
}