样例运行正常,但测试全WA
#define _CRT_SECURE_NO_WARNINGS
using namespace std ;
#include <iostream>
typedef long long U ;
//lowbit函数
//x-lowbit(x)跳到下一个树状数组节点
//x+lowbit(x)跳到上一个树状数组节点
U lowbit(U x)
{
return x & -x ;
}
//s[i]记录前i项的值
//因为tree[x] = ∑[ x - lowbit(x) + 1 , x],
//所以可以用s[x] - s[ x - lowbit(x)]表示tree[x]
U s[600000] ;
//tree[x]记录[x-lowbit[x]+1,x]的所有和
U tree[600000] ;
//单点修改
//limit表示最大上限,即树的顶端
void change(U x, U add , U limit )
{
for (U i = x; i < limit; i += lowbit(i))
{
tree[i] += add ;
}
}
//区间查询
//返回[1,x]所有项的和
U search(U x)
{
U ans = 0 ;
for (U i = x; i >= 1 ; i -= lowbit(i))
{
ans += tree [i] ;
}
return ans ;
}
int main()
{
U n , m ;
cin >> n >> m ;
//初始化
for (U i = 0; i <= n + 12; i++)
{
s[i] = 0 ;
}
//输入数据
for (U i = 1; i <= n; i++)
{
U a ;
cin >> a ;
//更新前i项和
if (i == 1)
{
s[i] = a ;
}
else
{
s[i] = s[i - 1] + a;
}
}
//初始化tree数组
for (U i = 1; i <= n; i++)
{
tree[i] = s[i] - s[i-lowbit(i) ] ;
}
//操作
U code , x , y ;
for (U i = 0; i < m; i++)
{
cin >> code >> x >> y ;
if (code == 1)
{
change( x , y , n ) ;
}
else
{
cout << search( y ) - search(x-1) << endl ;
}
}
return 0;
}