From ae778b4fd5a5d6ac9b2f1f509d0df3f91aa755a7 Mon Sep 17 00:00:00 2001 From: Baoshuo Date: Mon, 12 Dec 2022 19:26:32 +0800 Subject: [PATCH] 2653. middle https://hydro.ac/d/bzoj/record/63970fbe531ceac46d7ed623 --- BZOJ/2653/2653.cpp | 159 +++++++++++++++++++++++++++++++++++++++++++ BZOJ/2653/data/1.in | 3 + BZOJ/2653/data/1.out | 3 + BZOJ/2653/data/2.in | 3 + BZOJ/2653/data/2.out | 3 + BZOJ/2653/data/3.in | 3 + BZOJ/2653/data/3.out | 3 + BZOJ/2653/data/4.in | 3 + BZOJ/2653/data/4.out | 3 + BZOJ/2653/data/5.in | 3 + BZOJ/2653/data/5.out | 3 + 11 files changed, 189 insertions(+) create mode 100644 BZOJ/2653/2653.cpp create mode 100644 BZOJ/2653/data/1.in create mode 100644 BZOJ/2653/data/1.out create mode 100644 BZOJ/2653/data/2.in create mode 100644 BZOJ/2653/data/2.out create mode 100644 BZOJ/2653/data/3.in create mode 100644 BZOJ/2653/data/3.out create mode 100644 BZOJ/2653/data/4.in create mode 100644 BZOJ/2653/data/4.out create mode 100644 BZOJ/2653/data/5.in create mode 100644 BZOJ/2653/data/5.out diff --git a/BZOJ/2653/2653.cpp b/BZOJ/2653/2653.cpp new file mode 100644 index 00000000..0583b601 --- /dev/null +++ b/BZOJ/2653/2653.cpp @@ -0,0 +1,159 @@ +#include +#include +#include +#include + +using std::cin; +using std::cout; +const char endl = '\n'; + +const int N = 2e4 + 5; + +int n, q, lst; +int cnt, root[N]; +std::pair a[N]; + +struct node { + int l, r, l_max, r_max, sum; +} tr[N << 5]; + +void pushup(int u) { + tr[u].sum = tr[tr[u].l].sum + tr[tr[u].r].sum; + tr[u].l_max = std::max(tr[tr[u].l].l_max, tr[tr[u].l].sum + tr[tr[u].r].l_max); + tr[u].r_max = std::max(tr[tr[u].r].r_max, tr[tr[u].r].sum + tr[tr[u].l].r_max); +} + +int build(int l, int r) { + int p = ++cnt; + + if (l == r) { + tr[p].l_max = tr[p].r_max = tr[p].sum = 1; + + return p; + } + + int mid = l + r >> 1; + + tr[p].l = build(l, mid); + tr[p].r = build(mid + 1, r); + + pushup(p); + + return p; +} + +int insert(int p, int l, int r, int x, int y) { + int q = ++cnt; + tr[q] = tr[p]; + + if (l == r) { + tr[q].l_max = tr[q].r_max = tr[q].sum = y; + + return q; + } + + int mid = l + r >> 1; + + if (x <= mid) tr[q].l = insert(tr[q].l, l, mid, x, y); + else tr[q].r = insert(tr[q].r, mid + 1, r, x, y); + + pushup(q); + + return q; +} + +int query_sum(int p, int l, int r, int ql, int qr) { + if (ql <= l && r <= qr) return tr[p].sum; + + int mid = (l + r) >> 1; + int res = 0; + + if (ql <= mid) res += query_sum(tr[p].l, l, mid, ql, qr); + if (qr > mid) res += query_sum(tr[p].r, mid + 1, r, ql, qr); + + return res; +} + +int query_l_max(int p, int l, int r, int ql, int qr) { + if (ql <= l && r <= qr) return tr[p].l_max; + + int mid = (l + r) >> 1; + + if (qr <= mid) return query_l_max(tr[p].l, l, mid, ql, qr); + if (ql > mid) return query_l_max(tr[p].r, mid + 1, r, ql, qr); + + return std::max(query_l_max(tr[p].l, l, mid, ql, qr), query_sum(tr[p].l, l, mid, ql, qr) + query_l_max(tr[p].r, mid + 1, r, ql, qr)); +} + +int query_r_max(int p, int l, int r, int ql, int qr) { + if (ql <= l && r <= qr) return tr[p].r_max; + + int mid = (l + r) >> 1; + + if (qr <= mid) return query_r_max(tr[p].l, l, mid, ql, qr); + if (ql > mid) return query_r_max(tr[p].r, mid + 1, r, ql, qr); + + return std::max(query_r_max(tr[p].r, mid + 1, r, ql, qr), query_sum(tr[p].r, mid + 1, r, ql, qr) + query_r_max(tr[p].l, l, mid, ql, qr)); +} + +bool check(int k, int a, int b, int c, int d) { + int sum = 0; + + if (b + 1 <= c - 1) sum += query_sum(root[k], 1, n, b + 1, c - 1); + + sum += query_r_max(root[k], 1, n, a, b); + sum += query_l_max(root[k], 1, n, c, d); + + return sum >= 0; +} + +int main() { + std::ios::sync_with_stdio(false); + cin.tie(nullptr); + + cin >> n; + + for (int i = 1; i <= n; i++) { + cin >> a[i].first; + + a[i].second = i; + } + + std::sort(a + 1, a + 1 + n); + + root[0] = build(1, n); + + for (int i = 1; i <= n; i++) { + root[i] = insert(root[i - 1], 1, n, a[i].second, -1); + } + + cin >> q; + + while (q--) { + std::vector q(4); + + for (int& x : q) cin >> x; + + std::transform(q.begin(), q.end(), q.begin(), [&](int x) -> int { + return (x + lst) % n + 1; + }); + std::sort(q.begin(), q.end()); + + int l = 0, r = n - 1, res = 0; + + while (l <= r) { + int mid = (l + r) >> 1; + + if (check(mid, q[0], q[1], q[2], q[3])) { + l = mid + 1; + res = mid; + } else { + r = mid - 1; + } + } + + cout << (lst = a[res + 1].first) << endl; + } + + return 0; +} diff --git a/BZOJ/2653/data/1.in b/BZOJ/2653/data/1.in new file mode 100644 index 00000000..59b19a33 --- /dev/null +++ b/BZOJ/2653/data/1.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e891d0851af88cb180743b0882f0d0f92172afb343807cab476db42aba1bcf5 +size 428585 diff --git a/BZOJ/2653/data/1.out b/BZOJ/2653/data/1.out new file mode 100644 index 00000000..8dcf7c2c --- /dev/null +++ b/BZOJ/2653/data/1.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cb4fd2a2a389021024865dcf1b9eb03d481c9ae1cf9468762aeeab8f0965b8f +size 230000 diff --git a/BZOJ/2653/data/2.in b/BZOJ/2653/data/2.in new file mode 100644 index 00000000..51fcd464 --- /dev/null +++ b/BZOJ/2653/data/2.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84bff6668b54431b56c04b1e435ca5388a19c4868e76a214cf3a2e4be123bd63 +size 286349 diff --git a/BZOJ/2653/data/2.out b/BZOJ/2653/data/2.out new file mode 100644 index 00000000..390730b9 --- /dev/null +++ b/BZOJ/2653/data/2.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a4f4acaebdfba20660cd42328286b73f4a779dd61f54581ec063ddda2e988f85 +size 150000 diff --git a/BZOJ/2653/data/3.in b/BZOJ/2653/data/3.in new file mode 100644 index 00000000..4f4acec0 --- /dev/null +++ b/BZOJ/2653/data/3.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efc82085958652bf5637b39c4947d5ac53431d38e90411f7090abd1ca020abf6 +size 464471 diff --git a/BZOJ/2653/data/3.out b/BZOJ/2653/data/3.out new file mode 100644 index 00000000..fade84ca --- /dev/null +++ b/BZOJ/2653/data/3.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45db61608e5c4b9b246c29c2ba7b9a991d4125d6289a46ea1346ec5a82fa2153 +size 250000 diff --git a/BZOJ/2653/data/4.in b/BZOJ/2653/data/4.in new file mode 100644 index 00000000..b8777c4e --- /dev/null +++ b/BZOJ/2653/data/4.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c4efd1ee3fa72bcc8f8b825f83e38f0fd6d81367624ee5ee8be063519a336e6 +size 197586 diff --git a/BZOJ/2653/data/4.out b/BZOJ/2653/data/4.out new file mode 100644 index 00000000..f2c23983 --- /dev/null +++ b/BZOJ/2653/data/4.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:348312b29567b5a3baa2c3a368dc3b4f9ad77c5b51437fc7e2e1797f86c2feff +size 100000 diff --git a/BZOJ/2653/data/5.in b/BZOJ/2653/data/5.in new file mode 100644 index 00000000..fef318cd --- /dev/null +++ b/BZOJ/2653/data/5.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:629c9487e1b7246e7c6bd9dfd27d7df295892e241a8c0c137b6c18780c4a9159 +size 375069 diff --git a/BZOJ/2653/data/5.out b/BZOJ/2653/data/5.out new file mode 100644 index 00000000..aeaf822c --- /dev/null +++ b/BZOJ/2653/data/5.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b308eda1e1fdb1ccf7254138139d31a748dc0835c0bea1cd5b5ab57a63246ee6 +size 200000