http://blog.csdn.net/int64ago/article/details/7429868
板子
#include<iostream>
using namespace std;
int n,m;
int c[500001];
int lowbit(int i)
{ return i&(-i);
}
int add(int x,int i)
{ while (i<=n)
{ c[i]+=x;
i+=lowbit(i);
}
}
int sum(int x)
{ int ans=0;
while (x>0)
{ ans+=c[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
cin>>n>>m;
for (int i=1;i<=n;++i)
{ int x;cin>>x;
add(x,i);
}
for (int i=1;i<=m;++i)
{ int k,a,b;cin>>k>>a>>b;
if (k==1)
add(b,a);//單點修改
else
cout<<sum(b)-sum(a-1)<<endl;//輸出區間和
}
}
還有一種就是區間修改單點查詢利用的是差分
#include<iostream>
using namespace std;
int n,m;
int c[500001];int d[500001];
int lowbit(int i)
{ return i&(-i);
}
int add(int x,int i)
{ while (i<=n)
{ c[i]+=x;
i+=lowbit(i);
}
}
int sum(int x)
{ int ans=0;
while (x>0)
{ ans+=c[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
cin>>n>>m;
for (int i=1;i<=n;++i)
{ cin>>d[i];
}
for (int i=1;i<=m;++i)
{ int k,a,b,s;cin>>k;
if (k==1)
cin>>a>>b>>s;
else
cin>>b;
if (k==1)
{ add(s,a);
if (b+1<=n)
add(-s,b+1);//區間是修改
}
else
cout<<sum(b)+d[b]<<endl;//單點查詢
}
}