线段树,求调
查看原帖
线段树,求调
373819
lizichang楼主2022/11/21 15:54
#include<bits/stdc++.h>
#include<cstdio>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define root 1,n,1
using namespace std;
const int N=1e5+5;
struct node
{
	long long col,l,r,minn;
	node()
	{
		col=l=r=0;
		minn=0x7f7f7f7f;
	}
	void color(int pls)
	{
		col+=pls;
		minn+=pls;
	}
}z[1000005];
long long T,n,q,a[N],b[N],x[N],ans[N];
long long cnt,op[N],ll[N],rr[N];
node operator+(const node &l,const node &r)
{
	node res;
	res.l=l.l,res.r=r.r;
	res.minn=min(l.minn,r.minn);
	return res;
}
void update(int rt)
{
	z[rt]=z[rt<<1]+z[rt<<1|1];
	//	cout<<1;
}
void push_col(int rt)
{
	if(z[rt].col)
	{
		z[rt<<1].color(z[rt].col);
		z[rt<<1|1].color(z[rt].col);
		z[rt].col=0;
	}
}
void build(int l,int r,int rt)
{
	if(l==r)
	{
		z[rt].l=z[rt].r=l;
		z[rt].minn=b[l];
		return ;
	}
	long long m=(l+r)>>1;
	//cout<<l<<' '<<r<<' '<<m<<' '<<m+1<<' '<<(rt<<1)<<' '<<(rt<<1|1)<<endl;
	build(lson);
	build(rson);
	update(rt);
}
node query(int l,int r,int rt,int nl,int nr)
{
	if(nl<=l&&r<=nr)	return z[rt];
	long long m=(l+r)>>1;
	push_col(rt);
	if(m>=nl)
	{
		if(m<nr)	return query(lson,nl,nr)+query(rson,nl,nr);
		else	return query(lson,nl,nr);
	}
	else return query(rson,nl,nr);
}
void modify(int l,int r,int rt,int nl,int nr,int pls)
{
	//cout<<l<<' '<<r<<' '<<rt<<'\n';
	if(nl<=l&&r<=nr)
	{
		z[rt].color(pls);
		return ;
	}
	push_col(rt);
	long long m=(l+r)>>1;
	if(m>=nl)	modify(lson,nl,nr,pls);
	if(m<nr)	modify(rson,nl,nr,pls);
	update(rt);
}
int main()
{
	freopen("restore3.in","r",stdin);
	freopen("restore.out","w",stdout);
	cin>>T;
	while(T--)
	{
		cnt=0;
		memset(z,0x7f7f7f7f,sizeof(z));
		memset(ans,0,sizeof(ans));
		memset(x,0,sizeof(x));
		memset(a,0,sizeof(a));
		memset(ll,0,sizeof(ll));
		memset(rr,0,sizeof(rr));
		memset(op,0,sizeof(op));
		memset(ans,0,sizeof(ans));
		cin>>n>>q;
		for(int i=1;i<=n;i++)	cin>>a[i];
		for(int i=1;i<=q;i++)
		{
			cin>>op[i]>>ll[i]>>rr[i];
			if(op[i]==1)	cin>>x[i];
		}
		for(int i=1;i<=n;i++)	cin>>b[i];
		build(root);
		for(int i=q;i>0;i--)
		{
			if(op[i]==1)
				modify(root,ll[i],rr[i],-x[i]);
			else
				ans[++cnt]=query(root,ll[i],rr[i]).minn;
		}
		for(int i=cnt;i>0;i--)	cout<<ans[i]<<' ';
		cout<<'\n';
	}
	return 0;
}
2022/11/21 15:54
加载中...