树状数组
#include <bits/stdc++.h> using namespace std; //规定下标从一开始 int a[1000],c[1000],n; int lowbit(int x){ return x&(-x); } //获得前n项和的值 int get_sum(int x){ int s=0; while(x>0){ s+=c[x]; x=x-lowbit(x); } return s; } //获得区间的值 int get_range_sum(int i,int j){ return get_sum(j)-get_sum(i)+a[i]; } //把i位置增加x值 void update(int i,int x){ a[i]+=x;//别忘了 while(i<=n){ c[i]+=x; i=i+lowbit(i); } } //把i位置设置为x值 void set_value(int i,int x){ int p=i; while(i<=n){ c[i]=c[i]-a[p]+x; i=i+lowbit(i); } a[p]=x;//别忘了 } int main() { cin>>n; memset(a,0, sizeof(a)); memset(c,0, sizeof(c)); for(int i=1;i<=n;i++){ //如果cin>>a[i],set_value(i,a[i]);的话,会错误 int x; cin>>x; // set_value(i,x); update(i,x); } cout<<get_sum(n)<<endl; set_value(1,100); cout<<get_range_sum(1,1)<<endl; return 0; }