#include<iostream> #include<algorithm> #include<string.h> using namespace std; #define MAXN 10005 int c[MAXN]; int a[MAXN]; int n; int lowbit(int x) { return x&(-x); } void add(int x,int p)//对x位置增加p; { while(x<=n) { c[x]+=p; x+=lowbit(x); } } int getsum(int x)//1-x的和 ; { int res=0; while(x) { res+=c[x]; x-=lowbit(x); } return res; } int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } memset(c,0,sizeof(c)); for(int i=1;i<=n;i++) { add(i,a[i]);//构造树状数组 } int l,r; while(cin>>l>>r) { cout<<getsum(r)-getsum(l-1)<<endl;//输出区间l到r(闭区间)的和; } return 0; }
树状数组求区间和
猜你喜欢
转载自blog.csdn.net/duanghaha/article/details/80454028
今日推荐
周排行