这是一个模板,奇数点存本身值,偶数点根据其二进制中1的个数存2的n次方个值,这样改值用logn就可以了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iomanip>
using namespace std;
int n,m,a[500009],c[500009];
int change(int pos,int v)
{
for(int i=pos;i<=n;i+=i&(-i))
{
c[i]+=v;
}
return 0;
}
int qusum(int x)
{
int ans=0;
for(int i=x;i>0;i-=i&(-i))
{
ans+=c[i];
}
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
for(int i=1;i<=n;++i)
{
change(i,a[i]);
}
for(int i=1;i<=m;++i)
{
int pop;int x,y;
scanf("%d%d%d",&pop,&x,&y);
if(pop==1)
{
change(x,y);
}
else
{
cout<<qusum(y)-qusum(x-1)<<endl;
}
}
return 0;
}