P3374 【模板】树状数组 1
【单点修改,区间查询】
题意
【模板】树状数组 1
题目描述
如题,已知一个数列,你需要进行下面两种操作:
-
将某一个数加上
-
求出某区间每一个数的和
输入格式
第一行包含两个正整数 ,分别表示该数列数字的个数和操作的总个数。
第二行包含 个用空格分隔的整数,其中第 个数字表示数列第 项的初始值。
接下来 行每行包含 个整数,表示一个操作,具体如下:
-
1 x k
含义:将第 个数加上 -
2 x y
含义:输出区间 内每个数的和
输出格式
输出包含若干行整数,即为所有操作 的结果。
样例 #1
样例输入 #1
5 5
1 5 4 2 3
1 1 3
2 2 5
1 3 -1
1 4 2
2 1 4
样例输出 #1
14
16
提示
【数据范围】
对于 的数据,,;
对于 的数据,;
对于 的数据,。
数据保证对于任意时刻, 的任意子区间(包括长度为 和 的子区间)和均在 范围内。
样例说明:
故输出结果14、16
解析
单点修改,区间查询 模板题
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
int tr[N],n,m;
int lowbit(int x){
return x & -x;
}
void add(int x,int k){
while(x <= n){
tr[x] += k;
x = x + lowbit(x);
}
}
int sum(int x){
int ans = 0;
while(x >= 1){
ans += tr[x];
x = x - lowbit(x);
}
return ans;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1,x;i<=n;i++){
scanf("%d",&x);
add(i,x);
}
while(m--){
int op,x,y;
scanf("%d %d %d",&op,&x,&y);
if(op == 1){
add(x,y);
}else{
printf("%d\n",sum(y) - sum(x-1));
}
}
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!