树状数组是依靠位运算的一种数据结构。此模板用于单点修改,区间求和。。
#include <iostream>
using namespace std;
int n,c[50000005]={};
int lowbit(int a)
{ return a&-a; }
void add(int k,int x)
{
while (k<=n)
{
c[k]+=x;
k+=lowbit(k);
}
return;
}
int num(int xd)
{
int sum=0;
while (0<xd)
{
sum+=c[xd];
xd-=lowbit(xd);
}
return sum;
}
int section(int x,int y)
{
return num(x)-num(y-1);
}
int main()
{
int m;
cin>>n>>m;
for (int i=1;i<=n;i++)
{
int k;
cin>>k;
add(i,k);
}
for (int i=1;i<=m;i++)
{
int fl,x,y;
cin>>fl>>x>>y;
if (fl==1)//单点修改
{
add(x,y);
continue;
}
cout<<section(y,x);//区间求和
}
return 0;
}
原文:https://www.cnblogs.com/Kan-kiz/p/10536591.html