呃呃呃,样例过了,自己手造数据也过了,调了100年,测试点一个也过不了
#include<bits/stdc++.h>
#define int long long
using namespace std;
int arr[100010];
int tree[100010<<2], tg[100010<<2];
void build(int l, int r, int index, int x) {
tg[index] = -1;
if(l == r) {
if(arr[l] >= x) {
tree[index] = 1;
}
else
{
tree[index] = 0;
}
return;
}
int mid = l + r >> 1;
build(l,mid,index*2,x);
build(mid+1,r, index*2+1,x);
tree[index] = tree[index*2] + tree[index*2+1];
}
int ask(int askl, int askr, int l, int r, int index) {
if(askl > askr) {
return 0;
}
if(tg[index] != -1) {
tree[index] = (r-l+1) * tg[index];
tg[index*2] = tg[index];
tg[index*2+1] = tg[index];
tg[index] = -1;
}
if(l > askr || r < askl) {
return 0;
}
if(l >= askl && r <= askr) {
return tree[index];
}
int mid = l + r >> 1;
int lc = ask(askl, askr, l, mid, index*2);
int rc = ask(askl, askr, mid+1, r, index*2+1);
return lc + rc;
}
int n, m, k;
struct node{
int _1, _2, _3;
}que[100010];
void gai(int askl, int askr, int to, int l, int r, int index) {
if(askl > askr) {
return;
}
if(l > askr || r < askl) {
return;
}
if(l >= askl && r <= askr) {
tg[index] = to;
return;
}
int mid = l + r >> 1;
gai(askl, askr, to, l, mid, index*2);
gai(askl, askr, to, mid+1, r, index*2+1);
}
void shuchu() {
for(int i=1; i<=n; ++i) {
cout << ask(i,i,1,n,1) << " ";
}
cout << endl;
}
int check(int mid) {
memset(tree, 0, sizeof tree);
build(1,n,1,mid);
shuchu();
for(int i=1; i<=m; ++i) {
int l = que[i]._2, r = que[i]._3;
if(que[i]._1 == 0) { // 升序
int sum = ask(que[i]._2, que[i]._3, 1, n, 1);
gai(l, r-sum, 0, 1, n, 1);
gai(r-sum+1,r,1,1,n,1);
}
else
{
int sum = ask(que[i]._2, que[i]._3, 1, n, 1);
gai(l, l+sum-1, 1, 1, n, 1);
gai(l+sum,r,0,1,n,1);
}
shuchu();
}
shuchu();
if(ask(k,k,1,n,1) == 1) {
return true;
}
else
{
return false;
}
}
signed main() {
cin >> n >> m;
for(int i=1; i<=n; ++i) {
cin >> arr[i];
}
for(int i=1; i<=m; ++i) {
cin >> que[i]._1 >> que[i]._2 >> que[i]._3;
}
cin >> k;
int l=1, r=n, ans = -1;
while(l<=r) {
int mid = l+r>>1;
cout << l << " " << r << " " << mid << endl;
if(check(mid)) {
ans = mid;
l = mid+1;
}
else
{
r = mid-1;
}
}
cout << ans;
return 0;
}