线段树1求调
  • 板块灌水区
  • 楼主GODTREE
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/12/24 12:07
  • 上次更新2023/12/24 14:51:19
查看原帖
线段树1求调
776799
GODTREE楼主2023/12/24 12:07
#include <bits/stdc++.h>
#define N 100005
using namespace std;
struct node
{
	int l,r,sum,tag;
}bit[N*4];
int n,m,in[N];
int ls(int p) {return p<<1;}
int rs(int p) {return p<<1|1;}
void push_down(int p)
{
	bit[ls(p)].tag+=bit[p].tag;
	bit[rs(p)].tag+=bit[p].tag;
	bit[p].tag=0;
	bit[ls(p)].sum+=(bit[ls(p)].r-bit[ls(p)].l+1)*bit[ls(p)].tag;
	bit[rs(p)].sum+=(bit[ls(p)].r-bit[ls(p)].l+1)*bit[rs(p)].tag;
}
void push_up(int p)
{
	bit[p].sum=bit[ls(p)].sum+bit[rs(p)].sum;
}
void build(int p,int l,int r)
{
	bit[p].l=l,bit[p].r=r;
	if (l==r)
	{
		bit[p].sum=in[(l+r)/2];
		return ;
	}
	int mid=(l+r)/2;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	bit[p].sum=bit[ls(p)].sum+bit[rs(p)].sum;
}
int quary(int p,int l,int r)
{
	if (bit[p].l>r||bit[p].r<l) return 0;
	if (bit[p].l>=l&&bit[p].r<=r) return bit[p].sum;
	push_down(p);
	return quary(ls(p),l,r)+quary(rs(p),l,r);
}
void update(int p,int l,int r,int val)
{
	if (bit[p].l>r||bit[p].r<l) return ;
	if (bit[p].l>=l&&bit[p].r<=r)
	{
		bit[p].tag+=val;
		bit[p].sum+=(bit[p].r-bit[p].l+1)*bit[p].tag;
		return ;
	}
	push_down(p);
	update(ls(p),l,r,val);
	update(rs(p),l,r,val);
	push_up(p);
}
int main()
{
	cin>>n>>m;
	for (int i=1;i<=n;i++)
	{
		cin>>in[i];
	}
	build(1,1,n);
	for (int i=1;i<=m;i++)
	{
		int opt,x,y,val;
		cin>>opt;
		if (opt==1)
		{
			cin>>x>>y>>val;
			update(1,x,y,val);
		}
		else
		{
			cin>>x>>y;
			cout<<quary(1,x,y)<<"\n";
		}
	}
	return 0;
}
2023/12/24 12:07
加载中...