问题描述
给n个数和q个询问
询问有以下两种:
①: sum l r 这个查询询问从l到r区间的和
②: update x k 把位置在x上的数加上k
输入
第一行两个数 n,q (1<=n,q<=100000)
第二行n个数 (1<=ai<=1000000000)
接下来q行,每行一个询问
输出
对于每个第一类询问,你需要给出l到r的求和结果
对于第二类询问,则不需要输出
解决思路
很明显这是一道需要你用树状数组,这道题有个坑(请注意)update x k 此时的k有可能是个1000000000 因此int类型为参数的话 只能WA了。所以需要特别注意
那么这题就解决了
代码实现
#include <bits/stdc++.h>
using namespace std;
int n,q;
string str;
const int maxn=100010;
long long a[maxn];
long long c[maxn];
#define lowbit(i) ((i)&(-i))
long long getSum(int x)
{
long long sum=0;
for(int i=x;i>0;i-=lowbit(i))
{
sum+=c[i];
}
return sum;
}
void update(int x,long long v) //在位置为x上加v
{
for(int i=x;i<maxn;i+=lowbit(i))
{
c[i]+=v;
}
}
bool cmp(Node a,Node b)
{
return a.val<b.val;
}
int main()
{
long long z;
cin>>n>>q;
for(int i=1;i<=n;i++)
{
cin>>z;
update(i,z);
}
for(int i=1;i<=n;i++)
{
update(i,temp[i].val);
}
for(int i=0;i<q;i++)
{
int l,r;
int x;
long long k;
cin>>str;
if(str=="sum")
{
cin>>l>>r;
cout<<getSum(r)-getSum(l-1)<<endl;
}
else if(str=="update")
{
cin>>x>>k;
update(x,k);
}
}
}