吼吼吼
今天学习了树状数组
前一段时间没有认真看别人的讲解,
所以一直觉得很难,
今天仔细学了学,发现好像没那么难呢!
习题抽空做 !
想学习树状数组的同学可以在洛谷此题的第一篇题解上学习,非常容易理解(看我多好,链接都给大家了 )
不多说,上模板!
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,a,w,x,y;
int tree[5000010];
int lowbit(int x) //去掉从右往左数第一个1
{
return x&-x;
}
void add(int i,int k) //单点修改
{
while(i<=n)
{
tree[i]+=k;
i+=lowbit(i);
}
}
int sum(int x) //区间求和
{
int ans=0;
while(x!=0)
{
ans+=tree[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1; i<=n; i++)
{
scanf("%d",&a);
add(i,a);
}
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&w,&x,&y);
if(w==1)
add(x,y);
else if(w==2)
cout<<sum(y)-sum(x-1)<<endl; //巧妙之处,很像前缀和的求法
}
return 0;
}