这个成段的编写复杂度很低,不需要加大空间复杂度,便于处理成段加,询问每个位置的值的操作:
#include <bits/stdc++.h> using namespace std ; typedef long long ll ; typedef long double ld ; typedef unsigned long long ull ; #ifdef _WIN32 #define LLD "%I64d" #else #define LLD "%lld" #endif #define pi (acos(-1.0)) #define F first #define S second #define lson (o<<1),l,mid #define rson (o<<1|1),mid+1,r #define MP make_pair const double eps = 1e-9 ; const int inf = 0x3f3f3f3f ; const ll INF = (ll)4e18 ; const int M = (int)1e5+10 ; struct BIT { ll u[M] ; int n ; void clr(int _n) { n = _n ; memset (u,0,sizeof(int)*(n+1)) ; } void add (int x , ll v) { for (; x<=n ; x += x&-x) u[x] += v ; } void add (int l , int r , ll v) { add(l,v) ; add(r+1,-v) ; } ll get (int x , ll ret=0) { for (; x>0 ; x -= x&-x) ret += u[x] ; return ret ; } }bit ; int main () { int a[20] = {0,3,7,4,8,9,11,5,4,9,1} ; for (int i=1 ; i<=10 ; i++) printf ("%-4d" , a[i]) ; puts (""); bit.clr (10) ; for (int i=10 ; i>0 ; i--) { a[i] = a[i]-a[i-1] ; bit.add(i,i,a[i]) ; } for (int i=1 ; i<=10 ; i++) printf ("%-4d",a[i]) ; puts (""); for (int i=1 ; i<=10 ; i++) printf ("%-4d" , bit.u[i]) ; puts ("") ; int Q ; scanf ("%d" , &Q) ; while (Q --) { int x ; scanf ("%d" , &x) ; printf ("%d " , bit.get(x) ) ; } return 0 ; }