#include<cstdio>
#include<algorithm>
using namespace std;
struct Tree {
int l, r, x, sum, lmax, rmax;
}tree[20001 << 5];
struct node {
int x, num;
}numm[20001];
int n, last_answer, middle, now_sum;
int q, a, b, c, d, lef, rig;
int root[20001], t_n, answer;
bool cmp(node x, node y) {
return x.x < y.x;
}
int clone(int now) {
t_n++;
tree[t_n] = tree[now];
return t_n;
}
int build(int now, int l, int r) {
now = ++t_n;
if (l == r) {
tree[now].x = 1;
tree[now].sum = tree[now].x;
tree[now].lmax = tree[now].rmax = tree[now].x;
return now;
}
int mid = (l + r) >> 1;
tree[now].l = build(tree[now].l, l, mid);
tree[now].r = build(tree[now].r, mid + 1, r);
tree[now].sum = tree[tree[now].l].sum + tree[tree[now].r].sum;
tree[now].lmax = max(tree[tree[now].l].lmax, tree[tree[now].l].sum + tree[tree[now].r].lmax);
tree[now].rmax = max(tree[tree[now].r].rmax, tree[tree[now].r].sum + tree[tree[now].l].rmax);
return now;
}
int change(int now, int l, int r, int loc, int x) {
now = clone(now);
if (l == r) {
tree[now].x = tree[now].sum = x;
tree[now].lmax = tree[now].rmax = tree[now].x;
return now;
}
int mid = (l + r) >> 1;
if (loc <= mid) tree[now].l = change(tree[now].l, l, mid, loc, x);
else tree[now].r = change(tree[now].r, mid + 1, r, loc, x);
tree[now].sum = tree[tree[now].l].sum + tree[tree[now].r].sum;
tree[now].lmax = max(tree[tree[now].l].lmax, tree[tree[now].l].sum + tree[tree[now].r].lmax);
tree[now].rmax = max(tree[tree[now].r].rmax, tree[tree[now].r].sum + tree[tree[now].l].rmax);
return now;
}
int get_sum(int now, int l, int r, int L, int R) {
if (l >= L && r <= R) {
return tree[now].sum;
}
int mid = (l + r) >> 1, re = 0;
if (L <= mid) re += get_sum(tree[now].l, l, mid, L, R);
if (R >= mid + 1) re += get_sum(tree[now].r, mid + 1, r, L, R);
return re;
}
int get_lef(int now, int l, int r, int L, int R) {
if (l >= L && r <= R) return tree[now].lmax;
int mid = (l + r) >> 1;
if (mid + 1 <= R && mid >= L) return max(get_lef(tree[now].l, l, mid, L, R), get_sum(tree[now].l, l, mid, L, R) + get_lef(tree[now].r, mid + 1, r, L, R));
else if(mid + 1 <= R) return get_lef(tree[now].r, mid + 1, r, L, R);
else if (mid >= L) return get_lef(tree[now].l, l, mid, L, R);
}
int get_rig(int now, int l, int r, int L, int R) {
if (l >= L && r <= R) return tree[now].rmax;
int mid = (l + r) >> 1;
if (mid + 1 <= R && mid >= L) return max(get_rig(tree[now].r, mid + 1, r, L, R), get_sum(tree[now].r, mid + 1, r, L, R) + get_rig(tree[now].l, l, mid, L, R));
else if(mid + 1 <= R) return get_rig(tree[now].r, mid + 1, r, L, R);
else if (mid >= L) return get_rig(tree[now].l, l, mid, L, R);
}
bool check(int middle) {
now_sum = 0;
if (b + 1 <= c - 1) now_sum += get_sum(root[middle], 1, n, b + 1, c - 1);
now_sum += get_rig(root[middle], 1, n, a, b);
now_sum += get_lef(root[middle], 1, n, c, d);
return now_sum >= 0;
}
void sort_abcd() {
if (a > b) swap(a, b);
if (a > c) swap(a, c);
if (a > d) swap(a, d);
if (b > c) swap(b, c);
if (b > d) swap(b, d);
if (c > d) swap(c, d);
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &numm[i].x);
numm[i].num = i;
}
sort(numm + 1, numm + n + 1, cmp);
root[1] = build(0, 1, n);
for (int i = 2; i <= n; i++)
root[i] = change(root[i - 1], 1, n, numm[i - 1].num, -1);
scanf("%d", &q);
for (int times = 1; times <= q; times++) {
scanf("%d %d %d %d", &a, &b, &c, &d);
a = (a + last_answer) % n;
b = (b + last_answer) % n;
c = (c + last_answer) % n;
d = (d + last_answer) % n;
a++;
b++;
c++;
d++;
sort_abcd();
lef = 1;
rig = n;
while (lef <= rig) {
middle = (lef + rig) >> 1;
if (check(middle)) {
answer = middle;
lef = middle + 1;
}
else rig = middle - 1;
}
last_answer = numm[answer].x;
printf("%d\n", last_answer);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现