lpnp6 @ 2023-03-08 14:52:22
#include<bits/stdc++.h>
#include <iostream>
#include <variant>
using namespace std;
struct node{
int l,r;
long long sum;
}tr[6000001];
int n,m,cnt=1;
void build(int root,int l,int r)
{
tr[root].l=l,tr[root].r=r;
if(l==r)
{
int input;
cin>>input;
tr[root].sum=input;
return;
}
build(2*root,l,(l+r)/2);
build(2*root+1,(l+r)/2+1,r);
tr[root].sum=tr[2*root].sum+tr[2*root+1].sum;
}
void add(int root,int x,int y,int k)
{
if(tr[root].r<x||tr[root].l>y)return;
if(tr[root].l==tr[root].r)
{
tr[root].sum+=k;
return;
}
add(2*root,x,y,k);
add(2*root+1,x,y,k);
tr[root].sum=tr[2*root].sum+tr[2*root+1].sum;
}
long long getsum(int root,int x,int y)
{
if(tr[root].l>=x&&tr[root].r<=y)return tr[root].sum;
if(tr[root].l>y||tr[root].r<x)return 0;
long long s=0;
if(y>=tr[root].l)s+=getsum(2*root,x,y);
if(x<=tr[root].r)s+=getsum(2*root+1,x,y);
return s;
}
int main()
{
cin>>n>>m;
build(1,1,n);
while(m--)
{
int op;
cin>>op;
int x,y,k;
switch (op)
{
case 1:
cin>>x>>y>>k;
add(1,x,y,k);
break;
case 2:
cin>>x>>y;
cout<<getsum(1,x,y)<<endl;
break;
}
}
}
by Bbaka @ 2023-03-08 15:07:15
@lpnp6 你这个修改太暴力了
by Bbaka @ 2023-03-08 15:08:36
如果修改多就会消耗很多的时间,修改应该采用懒标记或者标记永久化之类的方式来进行
by lpnp6 @ 2023-03-08 15:24:33
@Bbaka 明白了谢谢