WA三个点,求调
查看原帖
WA三个点,求调
571937
zhouyiran_2011楼主2023/12/28 18:12
#include<bits/stdc++.h>
#define lid (id<<1)
#define rid (id<<1|1)
using namespace std;
int n, m, a[500005], b, x, y, z;
struct seg_tree{
	int l, r;
	int sum, lazy;
}tr[2000005]; 
void build(int id, int l, int r) //建树 
{
	tr[id].l=l;
	tr[id].r=r;
	if(l==r)
	{
		tr[id].sum=a[l];
		return ; 
	}
	int mid=(l+r)>>1;
	build(lid, l, mid);
	build(rid, mid+1, r);
	tr[id].sum=tr[lid].sum+tr[rid].sum;
}
void pushdown(int id) //下放lazy 
{
	if(tr[id].lazy&&tr[id].l!=tr[id].r)
	{
		tr[lid].lazy+=tr[id].lazy;
		tr[rid].lazy+=tr[id].lazy;
		tr[lid].sum+=tr[id].lazy*(tr[lid].r-tr[lid].l+1);
		tr[rid].sum+=tr[id].lazy*(tr[rid].r-tr[rid].l+1);
		tr[id].lazy=0;
	}
}
void modify(int id, int l, int r, int val)//区间修改 
{
	pushdown(id);
	if(tr[id].l==l&&tr[id].r==r)
	{
		tr[id].lazy+=val;
		tr[id].sum+=val*(tr[id].r-tr[id].l+1);
		return ;
	}
	int mid=(tr[id].l+tr[id].r)>>1;
	if(r<=mid)
	{
		modify(lid, l, r, val);
	}
	else if(l>mid)
	{
		modify(rid, l, r, val);
	}
	else
	{
		modify(lid, l, mid, val);
		modify(rid, mid+1, r, val);
	}
	tr[id].sum=tr[lid].sum+tr[rid].sum;
}
int query(int id,int l, int r) //区间查询 
{
	pushdown(id);
	if(tr[id].l==l&&tr[id].r==r)
	{
		return tr[id].sum;
	}
	int mid=(tr[id].l+tr[id].r)>>1;
	if(r<=mid)
	{
		return query(lid, l, r);
	}
	if(l>mid)
	{
		return query(rid, l, r);
	}
	return query(lid,l,mid)+query(rid,mid+1,r);
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];		
	}
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		cin>>b;
		if(b==1)
		{
			cin>>x>>y>>z; 
			modify(1, x, y, z);
		}
		else
		{
			cin>>x>>y;
			cout<<query(1,x,y)<<endl;
		}
	}
	return 0;
}
2023/12/28 18:12
加载中...