1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
| #include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const int INF = 1009999999;
int getint() {
int r = 0, k = 1; char c = getchar();
for (; '0' > c || c > '9'; c = getchar()) if (c == '-') k = -1;
for (; '0' <= c && c <= '9'; c = getchar()) r = r * 10 - '0' + c;
return r * k;
}
int mid, Q, n, m;
int laz[400005], sum[400005], l[400005], r[400005];
int A[100005], B[100005], L[100005], R[100005];
void add(int now, int val) {
laz[now] = val;
sum[now] = (r[now]-l[now]+1)*val;
}
void pd(int now) {
if (laz[now] != -1) {
add(now << 1, laz[now]);
add(now << 1 | 1, laz[now]);
laz[now] = -1;
}
}
void pu(int now) {
sum[now] = sum[now << 1] + sum[now << 1 | 1];
}
void build(int now, int ll, int rr) {
l[now] = ll; r[now] = rr; laz[now] = -1;
if (ll == rr) {
sum[now] = (A[ll] >= mid);
return;
}
int mid = (ll + rr) >> 1;
build(now << 1, ll, mid);
build(now << 1 | 1, mid + 1, rr);
pu(now);
}
int query(int now, int ll, int rr) {
if (ll <= l[now] && r[now] <= rr)
return sum[now];
pd(now);
int mid = (l[now] + r[now]) >> 1, ret = 0;
if (ll <= mid) ret += query(now << 1, ll, rr);
if (rr > mid) ret += query(now << 1 | 1, ll, rr);
return ret;
}
void change(int now, int ll, int rr, int val) {
if (ll <= l[now] && r[now] <= rr) {
add(now, val);
return;
}
pd(now);
int mid = (l[now] + r[now]) >> 1;
if (ll <= mid) change(now << 1, ll, rr, val);
if (rr > mid) change(now << 1 | 1, ll, rr, val);
pu(now);
}
bool check() {
build(1, 1, n);
for (int i = 1; i <= m; ++i) {
int s = query(1, L[i], R[i]);
if (B[i]) {
change(1, L[i], L[i] + s - 1, 1);
change(1, L[i] + s, R[i], 0);
} else {
s = R[i] - L[i] + 1 - s;
change(1, L[i], L[i] + s - 1, 0);
change(1, L[i] + s, R[i], 1);
}
}
return query(1, Q, Q);
}
int main() {
n = getint(); m = getint();
for (int i = 1; i <= n; ++i)
A[i] = getint();
for (int i = 1; i <= m; ++i) {
B[i] = getint();
L[i] = getint();
R[i] = getint();
}
Q = getint();
int l = 1, r = n;
while (l < r) {
mid = (l + r + 1) >> 1;
if (check()) l = mid;
else r = mid - 1;
}
printf("%d", r);
return 0;
}
|