2068 统计和
树状数组是一个和归并排序有缘分的东西,和差分也是有缘分的,两个东西经常一块考,因为他们的思想都差不多,我提前维一个关系,表示每个数据的关系,然后将数据拆开进行操作,再根据我们提前维护的关系,更新原数据
所以,我说的都是废话吧(逃
第一个操作就是树状数组的单点修改操作
第二个操作利用差分就行了
对此我在题解中找到三个,打了三遍,却发现题解都™是错的
…
好吧我服了,原来这个题要开longlong,不开longlong见祖宗
#include<iostream>
using namespace std;
const int MAXN=100000+2;
typedef long long ll;
ll a[MAXN];
ll n,w;
int lowbit(ll x){
return x&(-x);
}
void add(ll p,ll x){
while(p<=n){
a[p]+=x;
p+=lowbit(p);
}
}
ll ask(ll p){
ll ans=0;
while(p>0){
ans+=a[p];
p-=lowbit(p);
}
return ans;
}
int main(){
cin>>n>>w;
for(ll i=1;i<=w;i++){
char q;
ll y,z;
cin>>q>>y>>z;
if(q=='x') add(y,z);
else cout<<ask(z)-ask(y-1)<<endl;
}
return 0;
}