线段树求调
查看原帖
线段树求调
230875
Surge_of_Force楼主2021/9/18 20:49
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAX=4*1e5+10;
inline int read()
{
	char qwqc=getchar();
	int qwqf=1,qwqx=0;
	while(qwqc<'0'||qwqc>'9')
	{
		if(qwqc=='-') qwqf=-1;
		qwqc=getchar();
	}
	while(qwqc>='0'&&qwqc<='9')
	{
		qwqx=(qwqx<<3)+(qwqx<<1)+(qwqc^48);
		qwqc=getchar();
	}
	return qwqf*qwqx;
}
struct node
{
	int l,r;
	ll w,th;
}tree[MAX];
inline void bl(int l,int r,int k)
{
	tree[k].l=l,tree[k].r=r;
	if(l==r)
	{
		tree[k].w=read();
		return ;
	}
	int mid=(l+r)>>1;
	bl(l,mid,k<<1);
	bl(mid+1,r,k<<1|1);
	tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
}
inline void down(int k)
{
	tree[k<<1].th+=tree[k].th;
	tree[k<<1|1].th+=tree[k].th;
	tree[k<<1].w+=tree[k].th*(tree[k<<1].r-tree[k<<1].l+1);
	tree[k<<1|1].w+=tree[k].th*(tree[k<<1|1].r-tree[k<<1|1].l+1);
	tree[k].th=0;
}
inline ll ask(int x,int y,int k,ll ans)
{
	if(tree[k].l>=x&&tree[k].r<=y)
	{
		ans+=tree[k].w;
		return ans;
	}
	if(tree[k].th) down(k);
	int mid=(tree[k].l+tree[k].r)>>1;
	if(y<=mid) ask(x,y,k<<1,ans);
	if(x>mid) ask(x,y,k<<1|1,ans);
}
inline void change(int x,int y,ll f,int k)
{
	if(tree[k].l>=x&&tree[k].r<=y)
	{
		tree[k].w+=(tree[k].r-tree[k].l+1)*f;
		tree[k].th+=f;
		return ;
	}
	if(tree[k].th) down(k);
	int mid=(tree[k].l+tree[k].r)>>1;
	if(y<=mid) change(x,y,f,k<<1);
	if(x>mid) change(x,y,f,k<<1|1);
	tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
}
int main()
{
	int n=read(),m=read();
	bl(1,n,1);
	for(int i=1;i<=4*n;i++) 
		cout<<tree[i].w<<" ";
	for(int i=1;i<=m;i++)
	{
		int pmh=read(),x=read(),y=read();
		if(pmh==1) 
		{
			int k=read();
			change(x,y,k,1);
		}
		if(pmh==2) cout<<ask(x,y,1,0)<<endl;
	}
	return 0;
}

2021/9/18 20:49
加载中...