树状数组
树状数组单点修改区间查询
#include<iostream> using namespace std; int n,m; int tree[2000020]; int lowbit(int x) { return x&(-x); } void update(int x,int v) { while(x<=n) { tree[x]+=v; x+=lowbit(x); } } int sum(int x) { int res=0; while(x>0) { res+=tree[x]; x-=lowbit(x); } return res; } int main() { ios::sync_with_stdio(false); int k; std::cin>>n>>m; for(int i=1;i<=n;i++) { std::cin>>k; update(i,k); } int a,b,c; while(m--) { std::cin>>a>>b>>c; if(a==1) { update(b,c); } else { cout<<(sum(c)-sum(b-1))<<endl; } } cin.tie(0); return 0; }
树状数组区间修改单点查询
#include<iostream> using namespace std; typedef long long ll; int n,m; ll tree[500010],nm[500010]; ll lowbit(ll x) { return x&(-x); } void update(ll x,ll v) { while(x<=n) { tree[x]+=v; x+=lowbit(x); } } ll sum(ll x) { ll res=0; while(x>0) { res+=tree[x]; x-=lowbit(x); } return res; } int main() { ios::sync_with_stdio(false); cin>>n>>m; ll k; for(ll i=1;i<=n;i++) { cin>>nm[i]; update(i,nm[i]-nm[i-1]); } ll a,b,c,d; while(m--) { cin>>a; if(a==1) { cin>>b>>c>>d; update(b,d); update(c+1,-d); } else { cin>>b; cout<<sum(b)<<endl; } } cin.tie(0); return 0; }