整体二分自闭人,求助
查看原帖
整体二分自闭人,求助
331947
hegm楼主2023/1/26 20:27

只对了 #10 #12

#include<bits/stdc++.h>
#define inf 1000000000005
#define int long long
#define N 10000006
#define ls (now<<1)
#define rs (now<<1|1)
using namespace std;
int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
int n,m,ans[N];
struct node
{
	int op,l,r,c,id;
}s;
vector<node> v;
struct tree
{
	int tag,val;
}tr[N];
int lowbit(int x){return x&(-x);}
void up(int now){tr[now].val=tr[ls].val+tr[rs].val;}
void down(int now)
{
	if(tr[now].tag!=0)
	{
		tr[ls].val+=tr[now].tag;
		tr[rs].val+=tr[now].tag;
		tr[ls].tag+=tr[now].tag;
		tr[rs].tag+=tr[now].tag;
		tr[now].tag=0;
	}
}
void add(int now,int l,int r,int ql,int qr,int val)
{
	if(l>=ql&&r<=qr)
	{
		tr[now].val+=val*(r-l+1);
		tr[now].tag+=val;
		return ; 
	}
	down(now);
	int mid=(l+r)>>1;
	if(mid>=ql)add(ls,l,mid,ql,qr,val);
	if(mid<qr)add(rs,mid+1,r,ql,qr,val);
	up(now);
}
int que(int now,int l,int r,int ql,int qr)
{
	if(l>=ql&&r<=qr)return tr[now].val;
	down(now);
	int mid=(l+r)>>1,cnt=0;
	if(mid>=ql)cnt+=que(ls,l,mid,ql,qr);
	if(mid<qr)cnt+=que(rs,mid+1,r,ql,qr);
	return cnt;
}
void solve(int l,int r,vector<node> v)
{
	if(l>r)return ;
	if(v.size()==0)return ;
	if(l==r)
	{
		for(int i=0,con=v.size();i<con;i++)
		if(v[i].op==2)ans[v[i].id]=l;
		return ;
	}
	vector<node> v1,v2;
	int t1=0,t2=0,mid=(l+r)/2;
	if(mid<0)mid-=1;
	for(int i=0,con=v.size();i<con;i++)
	{
		if(v[i].op==1)
		{
			if(v[i].c>mid)
			{
				add(1,1,n,v[i].l,v[i].r,1);
				v2.push_back(v[i]);
			}
			else v1.push_back(v[i]);
		}
		else
		{
			int res=que(1,1,n,v[i].l,v[i].r);
			if(v[i].c<=res)v2.push_back(v[i]),t2++;
			else
			{
				v[i].c-=res;t1++;
				v1.push_back(v[i]);
			}
		}
	}
	for(int i=0,con=v.size();i<con;i++)
	{
		if(v[i].op==1&&v[i].c>mid)
		add(1,1,n,v[i].l,v[i].r,-1);
	}
	if(t1)solve(l,mid,v1);
	if(t2)solve(mid+1,r,v2);
}
signed main()
{
	n=read();m=read();
	for(int i=1;i<=m;i++)
	{
		s.op=read();s.l=read();s.r=read();s.c=read();
		s.id=i;
		v.push_back(s);
	}
	solve(-n,n,v);
	for(int i=1;i<=m;i++)
	if(ans[i])cout<<ans[i]<<"\n";
	return 0;
}
2023/1/26 20:27
加载中...