P3374 【模板】树状数组 1
第一次写博客
线段树
#include<bits/stdc++.h>
using namespace std;
const int MAXN=5*1e5+7;
int n,m;
long long a[MAXN];
long long tree[MAXN*4];
void build(int root,int l,int r){ //root 节点 l,r 区间
if(l==r) {
tree[root]=a[l];
return;
}
int mid=(l+r)>>1;
build(root<<1,l,mid);
build((root<<1)+1,mid+1,r);
tree[root]=tree[root<<1]+tree[(root<<1)+1];
}
void fun(int root,int l,int r,int pos,long long x){
if(l==pos&&l==r){
tree[root]+=x;
return;
}
int mid=(l+r)>>1;
if(pos<=mid) fun(root<<1,l,mid,pos,x);
else fun((root<<1)+1,mid+1,r,pos,x);
tree[root]=tree[root<<1]+tree[(root<<1)+1];
}
long long getsum(int root,int l,int r,int ql,int qr){
if(l>=ql&&r<=qr){
return tree[root];
}
int mid=(l+r)>>1;
long long res=0;
if(ql<=mid) res+=getsum(root<<1,l,mid,ql,qr);
if(qr>mid) res+=getsum((root<<1)+1,mid+1,r,ql,qr);
tree[root]=tree[root<<1]+tree[(root<<1)+1];
return res;
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++){
int op,x1,y1;
long long k1;
cin>>op;
if(op==1){
cin>>x1>>k1;
fun(1,1,n,x1,k1);
}
if(op==2){
cin>>x1>>y1;
cout<<getsum(1,1,n,x1,y1)<<"\n";
}
}
}
树状数组
#include<bits/stdc++.h>
using namespace std;
const int MAXN=5*1e5+5;
int n,m,op;
long long tree[MAXN],a[MAXN];
long long lowbit(int x){
return x&(-x);
}
long long notadd(int pos){
long long res=0;
while(pos>0)
{
res+=tree[pos];
pos-=lowbit(pos);
}
return res;
}
void add(int x,long long k){
while(x<=n){
tree[x]+=k;
x+=lowbit(x);
}
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
add(i,a[i]);
}
while(m--)
{
cin>>op;
if(op==1)
{
int x;
long long k;
cin>>x>>k;
add(x,k);
}
else if(op==2){
int x,y;
cin>>x>>y;
cout<<notadd(y)-notadd(x-1)<<"\n";
}
}
}