许诺 • 4天前
#include <iostream>
#include <vector>
#include <tuple>
using namespace std;
const int MAXN = 1e5 + 10;
struct Node {
int sum;
int cover;
} tree[4 * MAXN];
void build(int node, int l, int r, const vector& data) {
tree[node].cover = -1;
if (l == r) {
tree[node].sum = data[l];
return;
}
int mid = (l + r) >> 1;
build(2 * node, l, mid, data);
build(2 * node + 1, mid + 1, r, data);
tree[node].sum = tree[2 * node].sum + tree[2 * node + 1].sum;
}
void push_down(int node, int l, int r) {
if (tree[node].cover != -1) {
int mid = (l + r) >> 1;
int left = 2 * node;
tree[left].cover = tree[node].cover;
tree[left].sum = (mid - l + 1) * tree[node].cover;
int right = 2 * node + 1;
tree[right].cover = tree[node].cover;
tree[right].sum = (r - mid) * tree[node].cover;
tree[node].cover = -1;
}
}
void update_range(int node, int l, int r, int ul, int ur, int val) {
if (ur < l || ul > r) return;
if (ul <= l && r <= ur) {
tree[node].cover = val;
tree[node].sum = (r - l + 1) * val;
return;
}
push_down(node, l, r);
int mid = (l + r) >> 1;
update_range(2 * node, l, mid, ul, ur, val);
update_range(2 * node + 1, mid + 1, r, ul, ur, val);
tree[node].sum = tree[2 * node].sum + tree[2 * node + 1].sum;
}
int query_range(int node, int l, int r, int ql, int qr) {
if (qr < l || ql > r) return 0;
if (ql <= l && r <= qr) return tree[node].sum;
push_down(node, l, r);
int mid = (l + r) >> 1;
return query_range(2 * node, l, mid, ql, qr) + query_range(2 * node + 1, mid + 1, r, ql, qr);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
vector<int> arr(n);
for (int i = 0; i < n; ++i) {
cin >> arr[i];
}
vector<tuple<int, int, int>> ops(m);
for (int i = 0; i < m; ++i) {
int op, l, r;
cin >> op >> l >> r;
ops[i] = make_tuple(op, l - 1, r - 1);
}
int q;
cin >> q;
q--;
int low = 1, high = n;
int ans = -1;
while (low <= high) {
int mid = (low + high) >> 1;
vector<int> bit(n);
for (int i = 0; i < n; ++i) {
bit[i] = arr[i] >= mid ? 1 : 0;
}
build(1, 0, n - 1, bit);
for (const auto& op : ops) {
int type = get<0>(op);
int l = get<1>(op);
int r = get<2>(op);
int sum = query_range(1, 0, n - 1, l, r);
int len = r - l + 1;
if (type == 0) {
int k = len - sum;
if (k > 0) {
update_range(1, 0, n - 1, l, l + k - 1, 0);
}
if (sum > 0) {
update_range(1, 0, n - 1, l + k, r, 1);
}
} else {
int k = sum;
if (k > 0) {
update_range(1, 0, n - 1, l, l + k - 1, 1);
}
if (len - k > 0) {
update_range(1, 0, n - 1, l + k, r, 0);
}
}
}
int res = query_range(1, 0, n - 1, q, q);
if (res == 1) {
ans = mid;
low = mid + 1;
} else {
high = mid - 1;
}
}
cout << ans << endl;
return 0;
} 保熟
评论:
请先登录,才能进行评论