社区讨论
求助
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 条回复,欢迎继续交流。
正在加载回复...