蒟蒻新学线段树,自己检查不出错误,但是除第一次输出外均错误,求调
查看原帖
蒟蒻新学线段树,自己检查不出错误,但是除第一次输出外均错误,求调
801649
SN_Tashkent楼主2023/5/23 19:07
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+15;
struct Tree{
	int l,r;
	ll sum,add; 
}tr[4*N];
int n,m,a[N];
void build(int u,int l,int r)//建树 
{
	tr[u].l=l;
	tr[u].r=r;
	if(l==r)
	  tr[u].sum=a[l];
	else
	{
		int mid=(l+r)/2;
		build(u*2,l,mid);
		build(u*2+1,mid+1,r);
		tr[u].sum=tr[u*2].sum+tr[u*2+1].sum;
	}
}
void pushdown(int u)//更新懒标记 
{
	if(tr[u].add)
	{
		tr[u*2].sum+=tr[u].add*(tr[u*2].r-tr[u*2].l+1);
		tr[u*2+1].sum+=tr[u].add*(tr[u*2+1].r-tr[u*2+1].l+1);
		tr[u*2].add+=tr[u].add;
		tr[u*2+1].add+=tr[u].add;
		tr[u].add=0;
	 } 
}
void update(int u,int x,int y,ll k)
{
	int l=tr[u].l,r=tr[u].r,mid=(l+r)/2;
	if(x<=l&&y>=r)
	{
		tr[u].sum=(ll)(r-l+1)*k;
		tr[u].add+=k;//懒标记,子节点还未更新,在下次查询以及区间修改时更新 
	}
	else
	{
		pushdown(u);
		if(x<=mid)
		  update(u*2,x,y,k);
		if(y>mid)
		  update(u*2+1,x,y,k);
		tr[u].sum=tr[u*2].sum+tr[u*2+1].sum;
	}
}
ll query(int u,int x,int y)//查询 
{
	int l=tr[u].l,r=tr[u].r,mid=(l+r)/2;
	if(x<=l&&y>=r)
	  return tr[u].sum;
	pushdown(u);
	ll ans=0;
	if(x<=mid)
	  ans+=query(u*2,x,y);
	if(y>mid)
	  ans+=query(u*2+1,x,y);
	return ans;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	  cin>>a[i];
	build(1,1,n);
	while(m--)
	{
		int num,x,y,k;
		cin>>num;
		if(num==1)
		{
			cin>>x>>y>>k;
			update(1,x,y,k);
		}
		else
		{
			cin>>x>>y;
			cout<<query(1,x,y)<<endl;
		}
	}
	return 0;
}
2023/5/23 19:07
加载中...