社区讨论

求助

P3368【模板】树状数组 2参与者 14已保存回复 28

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
28 条
当前快照
1 份
快照标识符
@loclrwd1
此快照首次捕获于
2023/10/30 15:53
2 年前
此快照最后确认于
2023/11/05 03:01
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
const int maxn=5e5+5;
int sum[maxn<<2],a[maxn],lazy[maxn<<2],n,m;
inline void pushup(int id)
{
	sum[id]=sum[id<<1]+sum[id<<1|1];
}
inline void pushdown(int id,int l,int r)
{
	if(lazy[id])
	{
		int mid=l+r>>1;
		lazy[id<<1]+=lazy[id];
		lazy[id<<1|1]+=lazy[id];
		sum[id<<1]+=lazy[id]*(mid-l+1);
		sum[id<<1|1]+=lazy[id]*(r-mid);
		lazy[id]=0;
	}
	return;
}
inline void build(int id,int l,int r)
{
	if(l==r)
	{
		sum[id]=a[l];
		return;
	}
	int mid=l+r>>1;
	build(id<<1,l,mid);
	build(id<<1|1,mid+1,r);
	pushup(id);
}
inline void update(int id,int l,int r,int x,int y,int v)
{
	if(x<=l&&r<=y)
	{
		lazy[id]+=v;
		sum[id]+=v*(r-l+1);
	}
	pushdown(id,l,r);
	int mid=l+r>>1;
	if(x<=mid)
	{
		update(id<<1,l,mid,x,y,v);
	}
	if(y>mid)
	{
		update(id<<1|1,mid+1,r,x,y,v);
	}
	pushup(id);
}
inline int query(int id,int l,int r,int x,int y)
{
	if(x<=l&&r<=y)
	{
		return sum[id];
	}
	pushdown(id,l,r);
	int mid=l+r>>1,ans=0;
	if(x<=mid)
	{
		ans+=query(id<<1,l,mid,x,y);
	}
	if(y>mid)
	{
		ans+=query(id<<1|1,mid+1,r,x,y);
	}
	return ans;
} 
int main()
{
	n=read();
	m=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read(); 
	}
	build(1,1,n);
	int op,x,y,k;
	while(m--)
	{
		op=read();
		if(op==1)
		{
			x=read();
			y=read();
			k=read();
			update(1,1,n,x,y,k);
		}
		else
		{
			x=read();
			printf("%d",query(1,1,n,x,x));
			puts("");
		}
	}
}

回复

28 条回复,欢迎继续交流。

正在加载回复...