0pts!样例过了,求调
查看原帖
0pts!样例过了,求调
800347
yyazzy楼主2024/7/7 20:43
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 100010
int n,m,a[N],q;
struct questions
{
	int op,l,r;
}ques[N];
struct st
{
	int l,r,cnt1,tag;
#define l(x) tree[x].l
#define r(x) tree[x].r
#define cnt1(x) tree[x].cnt1
	#define tag(x) tree[x].tag
#define len(x) (tree[x].r-tree[x].l+1)
}tree[N<<2];
void change(int p)
{
	cnt1(p)=cnt1(p*2)+cnt1(p*2+1);
}
void spread(int p)
{
	if(tag(p))
	{
		tag(p*2)=tag(p*2+1)=tag(p);
		if(tag(p)==1)
		{
			cnt1(p*2)=len(p*2);
			cnt1(p*2+1)=len(p*2+1);
		}
		else cnt1(p*2)=cnt1(p*2+1)=0;
		tag(p)=0;
	}
}
void build(int p,int l,int r,int now)
{
//	cout<<p<<endl;
	l(p)=l,r(p)=r;
	if(l==r)
	{
		if(a[l]>=now)	cnt1(p)=1;	
		return ;
	}
	int mid=(l+r)/2;
	build(p*2,l,mid,now);
	build(p*2+1,mid+1,r,now);
	change(p);
}
void add(int p,int l,int r,int v)
{
	if(l<=l(p)&&r(p)<=r)
	{
		cnt1(p)=v*len(p);	
		tag(p)=v?1:-1;
		return;
	}
	spread(p);
	int mid=(l(p)+r(p))/2;
	if(l<=mid)add(p*2,l,r,v);
	if(r>mid) add(p*2+1,l,r,v);
	change(p);
	
}
int ask(int p,int l,int r)
{
	int ans=0;
	if(l<=l(p)&&r(p)<=r)
		return cnt1(p);
	spread(p);
	int mid=(l(p)+r(p))/2;
	if(l<=mid)ans+=ask(p*2,l,r);
	if(r>mid) ans+=ask(p*2+1,l,r);
	return ans;
	change(p);
}
bool check(int x)
{
	build(1,1,n,x);
	for(int i=1;i<=m;i++)
	{
		int L=ques[i].l,R=ques[i].r,op=ques[i].op;
		int cnt=ask(1,L,R);
		if(op==0)
		{
			add(1,L,R-cnt,0);
			add(1,R-cnt+1,R,1);
		}
		else{
			add(1,L,L+cnt-1,1);
			add(1,L+cnt,R,0);
		}
	}
	return ask(1,q,q);
}
signed main()
{
	freopen("sort.in","r",stdin);
	freopen("sort.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=m;i++)
		cin>>ques[i].op>>ques[i].l>>ques[i].r;
	cin>>q;
	int l=1,r=n;
	while(l+1<r)
	{
		int mid=(l+r)/2;
		if(check(mid))l=mid;
		else r=mid;
	}
	if(check(l))cout<<l;
	else cout<<r;
	return 0;
}
2024/7/7 20:43
加载中...