1 条题解
-
0
其实不用几乎改,但我这是懒得写了,这道题事实上不需要懒标记下传。因为是单点修改,是修改的”树叶“。 只是说用最基础的板子没有逻辑上的错误。
#include<iostream> using namespace std; #define lc p<<1 #define rc p<<1|1 #define N 200005 long long arr[N]; struct node { long long l,r,sum,add; }tr[N*4]; void PushUp(int p) { tr[p].sum=tr[lc].sum+tr[rc].sum; } void PushDown(long long p) { if(tr[p].add) { tr[lc].sum+=tr[p].add*(tr[lc].r-tr[lc].l+1); tr[rc].sum+=tr[p].add*(tr[rc].r-tr[rc].l+1); tr[lc].add+=tr[p].add; tr[rc].add+=tr[p].add; tr[p].add=0; } } void Update(long long p,int x,int y,long long k) //区间添加。 { if(x<=tr[p].l&&tr[p].r<=y) { tr[p].sum+=k*(tr[p].r-tr[p].l+1); tr[p].add+=k; return ; } long long m=(tr[p].l+tr[p].r)>>1; PushDown(p); if(x<=m) Update(lc,x,y,k); if(y>m) Update(rc,x,y,k); PushUp(p); } long long Query(long long p,long long l,int r) //查询 { if(l<=tr[p].l&&tr[p].r<=r) { return tr[p].sum; } long long m=(tr[p].l+tr[p].r)>>1; PushDown(p); long long sum=0; if(l<=m) sum+=Query(lc,l,r); if(r>m) sum+=Query(rc,l,r); return sum; } void Build(long long p,long long l,long long r) { tr[p]={l,r,arr[l],0}; if(l==r) return ; long long m=(l+r)>>1; Build(lc,l,m); Build(rc,m+1,r); PushUp(p); } long long n,m,op,x,y,k; int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>m; for(int i=1;i<=n;i++) cin>>arr[i]; Build(1,1,n); while(m--) { cin>>op>>x>>y; switch (op) { case 1: Update(1,x,x,y); break; case 2: long long res=Query(1,x,y); cout<<res<<"\n"; break; } } return 0; }
信息
- ID
- 107
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 162
- 已通过
- 28
- 上传者