P3374 【模板】树状数组 1
part1
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node1{int l,r,value;};
node1 node[2000020];
int a[500010];
void mt(int p,int l,int r)
{
int mid=(l+r)>>1;
node[p].l=l;
node[p].r=r;
if(l==r)
{
node[p].value=a[l];
return;
}
mt(p<<1,l,mid);
mt(p<<1|1,mid+1,r);
node[p].value=node[p<<1].value+node[p<<1|1].value;
}
int findNum(int p, int l, int r)
{
if(node[p].l==l&&node[p].r==r)return node[p].value;
int mid=(node[p].l+node[p].r)>>1;
if(r<=mid)return findNum(p<<1,l,r);
if(l>mid)return findNum(p<<1|1,l,r);
return findNum(p<<1,l,mid)+findNum(p<<1|1,mid+1,r);
}
void at(int i, int x)
{
int p=1;
while(1)
{
node[p].value+=x;
if(node[p].l==node[p].r) break;
int mid=(node[p].l+node[p].r)>>1;
p<<=1;
if(i>mid)p|=1;
}
return;
}
int n,m,x,y,z;
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;++i)cin >> a[i];
mt(1,1,n);
for(int i=1;i<=m;i++){
cin>>x>>y>>z;
if(x==1) at(y,z);
if(x==2) cout<<findNum(1,y,z)<<endl;
}
return 0;
}
part2
#include<bits/stdc++.h>
#define int long long
using namespace std;
int lowbit(int num){
return num&-num;
}
int n,m,t,z,x,y,a[500010],d[500010];
int get(int num){
int ans=0;
while(num!=0)
{
ans+=d[num];
num-=lowbit(num);
}
return ans;
}
void add(int x,int k)
{
while(x<=n)
{
d[x]+=k;
x+=lowbit(x);
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
add(i,a[i]);
}
for(int i=1;i<=m;i++){
cin>>z>>x>>y;
if(z==1){
add(x,y);
}
if(z==2){
cout<<get(y)-get(x-1)<<endl;
}
}
return 0;
}
本文来自博客园,作者:Arthur_Douglas,转载请注明原文链接:https://www.cnblogs.com/wenzhihao2023/p/17986668
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步