一个模板题,会树状数组基本操作就行了。
求2^k
int lowbit(int i)
{
return i&-i;
}
对一个点进行加减操作
void add(int x,int k)
{
for(int i=x;i<=n;i+=lowbit(i))
{
c[i]+=k;
}
}
还有种递归写法(递归层数可能太多,一般用上面这种)
void add(int x,int v){
if(x <= n){
C[x]+= v, add( x + lowbit(i), v );
}
}
区间求和
int sum(int i)
{
int s=0;
for(int j=i;j;j-=lowbit(j))
{
s+=c[j];
}
return s;
}
当然也有递归写法
int sum(int x){
return x ? C[x]+ sum( x - lowbit(x)):0;
}
最后总代码
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
const double EPS=1e-6;
typedef long long ll;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//#define int long long
int a[N],c[N];int n,m;
int lowbit(int i)
{
return i&-i;
}
int sum(int i)
{
int s=0;
for(int j=i;j;j-=lowbit(j))
{
s+=c[j];
}
return s;
}
void add(int x,int k)
{
for(int i=x;i<=n;i+=lowbit(i))
{
c[i]+=k;
}
}
signed main()
{
IOS;
//freopen("","r",stdin);
//freopen("","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
add(i,a[i]);
}
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
if(a==1)
{
add(b,c);
}
if(a==2)
{
int t1=sum(c);
int t2=sum(b-1);
cout<<t1-t2<<endl;
}
}
}