#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;
typedef pair<ll, int> pli;
typedef pair<ll, ll> pll;
int read()
{
char c = getchar(); int flag = 1, ans = 0;
while (c < '0' || c > '9') {if (c == '-') flag = -flag; c = getchar();}
while (c >= '0' && c <= '9') {ans = ans * 10 + c - '0'; c = getchar();}
return ans * flag;
}
const ll INF = 1e16;
const int MAXN = 100010;
const int MOD = 998244353;
int a[MAXN], b[MAXN];
int pos, n, m;
struct Query
{
int op;
int l, r;
}q[MAXN];
struct Tree
{
int lazy;
int val;
}t[MAXN << 2];
void build_tree (int now, int l, int r)
{
if (l == r)
{
t[now].val = b[l];
t[now].lazy = -1;
return;
}
int mid = (l + r) >> 1;
build_tree (now << 1, l, mid);
build_tree (now << 1 | 1, mid + 1, r);
t[now].val = t[now << 1].val + t[now << 1 | 1].val;
t[now].lazy = -1;
}
void push_down (int now, int l, int r)
{
if (t[now].lazy != -1)
{
int mid = (l + r) >> 1;
t[now << 1].lazy = t[now].lazy;
t[now << 1 | 1].lazy = t[now].lazy;
t[now << 1].val = t[now].lazy * (mid - l + 1);
t[now << 1 | 1].val = t[now].lazy * (r - mid);
t[now].lazy = -1;
}
}
void change (int now, int l, int r, int L, int R, int x)
{
if (L <= l && r <= R)
{
t[now].val = (r - l + 1) * x;
t[now].lazy = x;
return;
}
int mid = (l + r) >> 1;
if (mid >= L)
change (now << 1, l, mid, L, R, x);
if (mid < R)
change (now << 1 | 1, mid + 1, r, L, R, x);
t[now].val = t[now << 1].val + t[now << 1 | 1].val;
}
int query (int now, int l, int r, int L, int R)
{
if (L <= l && r <= R)
return t[now].val;
push_down (now, l, r);
int mid = (l + r) >> 1, ans = 0;
if (mid >= L)
ans += query (now << 1, l, mid, L, R);
if (mid < R)
ans += query (now << 1 | 1, mid + 1, r, L, R);
return ans;
}
int main()
{
n = read(), m = read();
for (int i = 1; i <= n; ++ i)
a[i] = read();
for (int i = 1; i <= m; ++ i)
q[i].op = read(), q[i].l = read(), q[i].r = read();
pos = read();
int l = 1, r = n;
while (l < r)
{
int mid = (l + r + 1) >> 1;
for (int i = 1; i <= n; ++ i)
{
if (a[i] >= mid) b[i] = 1;
else b[i] = 0;
}
build_tree (1, 1, n);
for (int i = 1; i <= m; ++ i)
{
int now = query (1, 1, n, q[i].l, q[i].r);
if (q[i].op)
{
change (1, 1, n, q[i].l, q[i].l + now - 1, 1);
change (1, 1, n, q[i].l + now, q[i].r, 0);
}
else
{
change (1, 1, n, q[i].l, q[i].r - now, 0);
change (1, 1, n, q[i].r - now + 1, q[i].r, 1);
}
}
if (query (1, 1, n, pos, pos) == 1)
l = mid;
else
r = mid - 1;
}
printf ("%d\n", l);
return 0;
}
这份代码MLE8个点,WA2个点,有没有带师帮帮我啊/kel