树状数组
理解来源
[https://baike.baidu.com/item/树状数组/313739?fr=aladdin]
#include<bits/stdc++.h>
using namespace std;
const int maxn=500005;
int tree[maxn];
int n,m;
int lowbit(int x){//
return x&-x;
}
void update(int x,int value){//向上更新它以及它所有祖先的信息
while(x<=n){
tree[x]+=value;
x+=lowbit(x);
}
}
int sum(int k){//求前k个数的和
int ans=0;
for(int i=k;i;i-=lowbit(i)){
ans+=tree[i];
}
return ans;
}
int main(){
int t,i,j,l,r;
cin>>t;
while(t--){
cin>>n>>m;
for(i=1;i<=n;i++)
{
cin>>j;
update(i,j);
}
while(m--){
cin>>l>>r;
cout<<sum(r)-sum(l-1)<<endl;
}
}
return 0;
}