解决单点更新的区间前缀和 #include <iostream> #include <cmath> #define int long long using namespace std; const int N=5e5+10; int n,T,tree[N]; int lowbit(int i){ return i&(-i); } //单点更新 找后继 void add(int id,int val){ for(int i=id;i<=n;i=i+lowbit(i)){ tree[i]+=val; } } //求前缀和 找前驱 int presum(int st){ int sum=0; //>=1不是0 for(int i=st;i>=1;i=i-lowbit(i)){ sum+=tree[i]; } return sum; } signed main(){ cin>>n>>T; for(int i=1;i<=n;i++){ int x;scanf("%lld",&x); add(i,x); } while(T--){ int opt,l,r;scanf("%lld %lld %lld",&opt,&l,&r); if(opt==1) add(l,r); else printf("%lld\n",presum(r)-presum(l-1)); } return 0; } 时间复杂度:O(mlogn)