求单点加,区间和
#include<iostream>
using namespace std;
int n,m;
int tree[234512567];
int lowbit(int k)
{
return k&-k;
}
void add(int x,int k)
{
while(x<=n)
{
tree[x]+=k;
x+=lowbit(x);
}
}
int sum(int x)
{
int ans=0;
while(x!=0)
{
ans+=tree[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int a;
cin>>a;
add(i,a);
}
for(int i=1;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
if(a==1)add(b,c);
if(a==2)cout<<sum(c)-sum(b-1)<<endl;
}
cin>>n;
return 0;
}
求区间加,单点的值
#include<iostream>
using namespace std;
int n,m,a;
int tree[2563127],q[24573549];
int lowbit(int k)
{
return k&-k;
}
void add(int x,int k)
{
while(x<=n)
{
tree[x]+=k;
x+=lowbit(x);
}
}
int search(int x)
{
int ans=0;
while(x!=0)
{
ans+=tree[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>q[i];
for(int i=1;i<=m;i++)
{
cin>>a;
if(a==1)
{
int x,y,z;
cin>>x>>y>>z;
add(x,z);add(y+1,-z);
}
if(a==2)
{
int x;
cin>>x;
cout<<q[x]+search(x)<<endl;
}
}
cin>>n;
return 0;
}