material/c++/algorithms/P3347_mod_BinaryIndexedTrees.cpp
2024-10-27 09:23:50 +00:00

56 lines
788 B
C++

//Copyright(c) 2024 e0x1a&ly. All right reserved.
#include<iostream>
#include<vector>
using namespace std;
void init(vector<int> &a)
{
for(int i=1; i < a.size(); i++)
{
int lowbit=(i & -i)>>1;
while(lowbit)
{
a[i]+=a[i-lowbit];
lowbit=lowbit>>1;
}
}
}
void add(int x,int k,vector<int> &a)
{
for(; x < a.size(); x+=(x & -x)) a[x]+=k;
}
int ask(int x,vector<int> &a)
{
int ans=0;
while(x) { ans+=a[x];x-=(x & -x);}
return ans;
}
int main()
{
//data init
int n,m,temp;
vector<int>a;a.push_back(0);
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i)
{
scanf("%d",&temp);
a.push_back(temp);
}
init(a);
while(m--) //在线操作
{
int x,y;
scanf("%d%d%d",&temp,&x,&y);
if(temp==1)
add(x,y,a);
else printf("%d\n",ask(y,a)-ask(x-1,a));
}
return 0;
}