60 point RE
查看原帖
60 point RE
437238
roaker楼主2021/11/20 09:54
#include<bits/stdc++.h>
#define int long long
#define mid ((l+r)>>1)
#define ls (x<<1)
#define rs (x<<1|1)
#define Lson ls,l,mid
#define Rson rs,mid+1,r
using namespace std;
const int maxn = 2e5 + 7;

inline int read()
{
	int x = 0, f = 1 ; char c = getchar();
	while(c < '0' || c > '9' ) { if( c == '-') f = -1 ; c = getchar() ; }
	while( c >= '0' && c <= '9' ) { x = x * 10 + c - '0' ; c = getchar() ; }
	return x * f;
}


int n,m;
int q;
int Ans;

int L[maxn],R[maxn],op[maxn];

struct tree{
	int Mark,Sum;
}Tree[maxn<<3];


int data[maxn],a[maxn];

void pulss(int x,int l,int r,int k)
{
	Tree[x].Sum = (r - l + 1) * k;
	Tree[x].Mark = k;
}

void push(int x,int l,int r)
{
	if(Tree[x].Mark != -1)
	{
		pulss(Lson,Tree[x].Mark); pulss(Rson,Tree[x].Mark);
		Tree[x].Mark = -1;
	}
}

void Build(int x,int l,int r)
{
	Tree[x].Mark = -1;
	if(l == r)
	{
		Tree[x].Sum = data[l];
		return ;
	}
	Build(Lson); Build(Rson);
	Tree[x].Sum = Tree[ls].Sum + Tree[rs].Sum;
	return ;
}

void Change(int x,int l,int r,int L,int R,int k)
{
	if(L <= l && r <= R)
	{
		pulss(x,l,r,k);
		return ;
	}
	push(x,l,r);
	if(L <= mid) Change(Lson,L,R,k);
	if(R > mid)  Change(Rson,L,R,k);
	Tree[x].Sum = Tree[ls].Sum + Tree[rs].Sum;
	return ;
}

int Query(int x,int l,int r,int L,int R)
{
	int ans = 0;
	if(L <= l && r <= R) return Tree[x].Sum;
	push(x,l,r);
	if(L <= mid) ans += Query(Lson,L,R);
	if(R > mid)  ans += Query(Rson,L,R);
	return ans;
}

bool ok(int x)
{
	for(int i = 1; i <= n; ++i) data[i] = (a[i] >= x);
	memset(Tree,0,sizeof Tree);
	Build(1,1,n);
	for(int i = 1; i <= m; ++i)
	{
		int cnt = Query(1,1,n,L[i],R[i]);
		if(op[i])
		{
			Change(1,1,n,L[i],L[i] + cnt - 1, 1);
			Change(1,1,n,L[i] + cnt,R[i], 0);
		}
		else
		{
			Change(1,1,n,R[i] - cnt + 1,R[i], 1);
			Change(1,1,n,L[i],R[i] - cnt, 0);
		}
	}
	return Query(1,1,n,q,q);
}

signed main()
{
	n = read(); m = read();
	for(int i = 1; i <= n; ++i) a[i] = read();
	for(int i = 1; i <= m; ++i)
	{
		op[i] = read(),L[i] = read(),R[i] = read();
		if(L[i] > R[i]) swap(L[i],R[i]);
	}
	q = read();
	int l = 1, r = n + 1;
	while(l < r - 1)
	{
		int M = ((l + r) >> 1);
		if(ok(M)) Ans = M,l = M;
		else r = M;
	}
	printf("%lld\n",Ans);
	return 0;
}
2021/11/20 09:54
加载中...