蒟蒻 8 pts 求助
查看原帖
蒟蒻 8 pts 求助
163337
Zpair楼主2021/8/2 10:44

只过了第一个点

#include<bits/stdc++.h>
#define MAXN 500005
#define INF 100000000
#define int long long
#define lson(x) ((x)*2)
#define rson(x) ((x)*2+1)
#define Pair pair<pair<int, int>, pair<int, int> >
#define L(x) (x.first.first)
#define R(x) (x.first.second)
#define B(x) (x.second.first)
#define E(x) (x.second.second)
#define MP(_x,x_,__x,x__) (make_pair(make_pair(_x,x_),make_pair(__x,x__)))
using namespace std;
Pair a[MAXN*4];
Pair now;
int lazy[MAXN*4];
Pair merge(Pair _x,Pair x_){
	Pair ans=MP(0ll,0ll,0ll,0ll);
	if(L(_x))L(ans)=max(L(_x),L(ans));
	if(B(_x))L(ans)=max(B(_x)+L(_x),L(ans));
	if(R(x_))R(ans)=max(R(x_),R(ans));
	if(B(x_))R(ans)=max(B(x_)+R(_x),R(ans));
	if(B(_x)&&B(x_))B(ans)=B(x_)+B(_x);
	E(ans)=max(E(_x),E(x_));
	if(R(_x)&&L(x_))E(ans)=max(E(ans),R(_x)+L(x_));
	return ans;
}
void pushdown(int x,int y,int p){
	int mid=(x+y)>>1;
	if(lazy[p]==1){
		lazy[lson(p)]=1;a[lson(p)]=MP(mid-x+1,mid-x+1,mid-x+1,mid-x+1);
		lazy[rson(p)]=1;a[rson(p)]=MP(y-mid,y-mid,y-mid,y-mid);
		lazy[p]=-1;
	}
	else if(lazy[p]==0){
		lazy[lson(p)]=0;a[lson(p)]=MP(0,0,0,0);
		lazy[rson(p)]=0;a[rson(p)]=MP(0,0,0,0);
		lazy[p]=-1;
	}
}
int query(int l,int r,int p,int X){
	pushdown(l,r,p);
	if(l==r)return l;
	int mid=(l+r)>>1;
	if(E(a[lson(p)])>=X)return query(l,mid,lson(p),X);
	else if(R(a[lson(p)])+L(a[rson(p)])>=X)return mid-R(a[lson(p)])+1;
	else if(E(a[rson(p)])>=X)return query(mid+1,r,rson(p),X);
	else return 0;
}
void modify(int x,int y,int l,int r,int val,int p){
	if(l<=x&&r>=y){
		if(val==1){
			lazy[p]=1;
			a[p]=MP(y-x+1,y-x+1,y-x+1,y-x+1);
		}
		if(val==0){
			lazy[p]=0;
			a[p]=MP(0,0,0,0);
		}
		return;
	}
	pushdown(x,y,p);
	int mid=(x+y)>>1;
	if(l<=mid)modify(x,mid,l,r,val,lson(p));
	if(r>mid)modify(mid+1,y,l,r,val,rson(p));
	a[p]=merge(a[lson(p)],a[rson(p)]);
}
void build(int l,int r,int p){
	if(l==r){
		a[p]=MP(1,1,1,1);
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,lson(p));
	build(mid+1,r,rson(p));
	a[p]=merge(a[lson(p)],a[rson(p)]);
	return;
}
int n,m;
signed main()
{
	cin>>n>>m;
	memset(lazy,-1,sizeof(lazy));
	build(1,n,1);
	int op,x,y;
	while(m--){
		scanf("%lld%lld",&op,&x);
		if(op==1){
			int left=query(1,n,1,x);
			printf("%lld\n",left);
			if(left)modify(1,n,left,left+x-1,0,1);
		}
		if(op==2){
			scanf("%lld",&y);
			modify(1,n,x,x+y-1,1,1);
		}
	}    
}
2021/8/2 10:44
加载中...