Input
每组测试用例首先一行是2个正整数N和M(N<=100000,M<=10000),其中,N表示士兵的数量,M表示有M个询问。
接下来一行是N个正整数,依次表示N位士兵CF的Rating。其中,Rating的取值范围是小于等于5000。
最后是M行的询问,每行包含2个正整数a和b,表示要计算从第a个士兵到第b个士兵的Rating之和(1<=a, b<=N)。
Output
每组数据输出M行,分别表示M个询问对应的Rating之和。
Sample Input:
5 2
1500 1921 2134 1462 2403
1 3
2 5
Sample Output:
5555
7920
AC代码
#include <bits/stdc++.h>
using namespace std;
#define max(a, b) ((a) > (b) ? (a) : (b))
#define INF 0x3f3f3f3f
typedef long long ll;
const int maxn = 100005;
int a[maxn],c[maxn],n,m,u,v;
int lowbit(int x){
return x&-x;
}
int sum(int i){ //1-i的和
int ret=0;
while(i>0){
ret+=c[i];
i-=lowbit(i);
}
return ret;
}
void add(int x,int p){ //对x位置增加p
while(x<=n){
c[x]+=p;
x+=lowbit(x);
}
}
int main(int argc, char **argv){
while(~scanf("%d%d",&n,&m)){
fill(c, c+maxn, 0);
for(int i=1; i<=n; i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++){
add(i,a[i]); //构造树状数组
}
while(m--){
scanf("%d%d",&u,&v);
if(u>v){
int temp=u;
u=v;
v=temp;
}
printf("%d\n",sum(v)-sum(u-1)); //输出区间和
}
}
return 0;
}