零分线段树求调
查看原帖
零分线段树求调
473710
hmr26108楼主2022/12/1 12:53
#include<bits/stdc++.h>
#define maxn 300010
#define INF 1000000000000010
#define int long long
using namespace std;
int a[maxn],t,top;
long long b[maxn],ans[maxn];
struct node
{
	int left,right;
	long long minn,sum;
	long long la;
}e[maxn*2];
struct ts
{
	int l,r,cnt,x;
}s[maxn];
void update(int id)
{
	//printf("update %d\n",id);
	//e[id].sum=e[id<<1].sum+e[id<<1|1].sum;
	e[id].minn=min(e[id<<1].minn,e[id<<1|1].minn);
}
void pushdown(int id)
{
	if(e[id].la)
	{
		e[id<<1].minn+=e[id].la;
		e[id<<1|1].minn+=e[id].la; 
		e[id<<1].la+=e[id].la;
		e[id<<1|1].la+=e[id].la;
		e[id].la=0;
		return ;
	}
}
void build(int id,int l,int r)
{
	e[id].left=l;
	e[id].right=r;
	e[id].la=0;
	if(l==r)
	{
		//e[id].sum=b[l];
		e[id].minn=b[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(id<<1,l,mid);
	build(id<<1|1,mid+1,r);
	update(id);
	return;
}
void change(int id,int l,int r,int d)
{
	if(l<=e[id].left&&r>=e[id].right)
	{
		e[id].la+=d;
		e[id].minn+=d;
		return;
	}
	pushdown(id);
	int mid=(e[id].left+e[id].right)>>1;
	if(l<=mid) change(id<<1,l,r,d);
	if(r>mid) change(id<<1|1,l,r,d);
	update(id);
}
long long query(int id,int l,int r)
{
	if(l<=e[id].left&&e[id].right<=r)
	{
		return e[id].minn;
	}
	pushdown(id);
	int mid=(e[id].left+e[id].right)>>1;
	long long val=INF;
	if(l<=mid) val=min(val,query(id<<1,l,r));
	if(r>mid) val=min(val,query(id<<1|1,l,r));
	return val;
}
void intt(int n,int q)
{
	top=0;
	memset(ans,0,sizeof(ans));
	memset(b,0,sizeof(b));
	memset(a,0,sizeof(a));
	memset(e,0,sizeof(e));
	memset(s,0,sizeof(s));
	for(int i=1;i<=n*2;i++) e[i].minn=INF;
}
signed main()
{
//	freopen("restore2.in","r",stdin);
//	freopen("ans.out","w",stdout);
	scanf("%lld",&t);
	while(t--)
	{
		int n,q;
		scanf("%lld%lld",&n,&q);
		intt(n,q);
		for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
		for(int i=1;i<=q;i++) 
		{
			scanf("%lld%lld%lld",&s[i].cnt,&s[i].l,&s[i].r);
			if(s[i].cnt==1) scanf("%d",&s[i].x),s[i].x=-s[i].x; 
		}
		for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
		build(1,1,n); 
		for(int i=q;i>=1;i--)
		{
			if(s[i].cnt==1)
			{
				change(1,s[i].l,s[i].r,s[i].x);
			}
			if(s[i].cnt==2)
			{
				top++;
				ans[top]=query(1,s[i].l,s[i].r);
			}
		}
		for(int i=top;i>=1;i--) printf("%lld ",ans[i]);
		printf("\n");
		//for(int i=1;i<=n*2;i++) printf("%lld ",e[i].sum);
	}
	return 0;
}
2022/12/1 12:53
加载中...