[模板]树状数组

OJ题号:洛谷P3374

 1 #include<cstdio>
 2 #include<cstring>
 3 #define maxn 500000
 4 int n,m;
 5 struct BIT {
 6     int val[maxn];
 7     BIT() {
 8         memset(val,0,sizeof val);
 9     }
10     int lowbit(int x) {
11         return x&-x;
12     }
13     void modify(int p,const int x) {
14         while(p<=n) {
15             val[p]+=x;
16             p+=lowbit(p);
17         }
18     }
19     int query(int p) {
20         int ans=0;
21         while(p) {
22             ans+=val[p];
23             p-=lowbit(p);
24         }
25         return ans;
26     }
27 };
28 BIT tree;
29 int main() {
30     scanf("%d%d",&n,&m);
31     for(int i=1;i<=n;i++) {
32         int x;
33         scanf("%d",&x);
34         tree.modify(i,x);
35     }
36     while(m--) {
37         int op,x,y;
38         scanf("%d%d%d",&op,&x,&y);
39         if(op==1) {
40             tree.modify(x,y);
41         }
42         else {
43             printf("%d\n",tree.query(y)-tree.query(x-1));
44         }
45     }
46     return 0;
47 }
时间: 2024-10-07 05:16:41

[模板]树状数组的相关文章

[模板]树状数组1/ZKW线段树

https://www.luogu.org/problemnew/show/P3374 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 #define rson (o<<1|1) 5 #define lson (o<<1) 6 const int N = 530000<<1;//zkw线段树只能查询(0,bit),所以只有bit-2个叶节点,bit-2<n

[模板]树状数组2

https://www.luogu.org/problemnew/show/P3368 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 #define lowbit(a) (a&(-a)) 6 7 int n, m, t[500010], bas[500010]; 8 9 inline void update(int x, int

树状数组 :单点修改,区间查询

本人水平有限,题解不到为处,请多多谅解 本蒟蒻谢谢大家观看 题目: Problem E: 树状数组 1 :单点修改,区间查询 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 231  Solved: 78[Submit][Status][Web Board] Description 给定数列 a[1],a[2],…,a[n],你需要依次进行 q个操作,操作有两类:1 i x:给定 i,x将 a[i]加上 x:2 l r:给定 l,r,求a[l]+a

浅析树状数组(二叉索引树)及一些模板

树状数组 动态连续和查询问题.给定一个n个元素的数组a1.a2.……,an,设计一个数据结构,支持以下两种操作:1.add(x,d):让ax增加d;2.query(l,r):计算al+al+1+…+ar 如何让query和add都能快速完成呢?方法有很多,这里介绍的便是树状数组.为此我们先介绍lowbit. 对于正整数x,我们定义lowbit(x)为x的二进制表达式中最右边的1所对应的值(而不是这个比特的序号).比如,38288的二进制1001010110010000,所以lowbit(3828

树状数组模板

看了很多讲解仍然不明就里,感觉反正代码很短,暂时当模板背过好了. //树状数组 单点修改 区间查询 const int maxn=1005; int tree[maxn],n; void init() { for (int i=1;i<=n;i++) tree[i]=0; } //初始化一个长度为n的树状数组,n为全局变量 int lowbit(it k) { return k&-k; } void add(int k,int x) //给位置k加x { while (k<=n) {

树状数组模板(改点求段 / 该段求点 / 改段求段)

1. 改点求段(单点更新, 区间求和) 代码: 1 #include <iostream> 2 using namespace std; 3 4 const int MAXN = 1e5 + 10; 5 int tree[MAXN], n; 6 7 int lowbit(int x){//返回 pow(2, k),其中k为末尾0的个数, 即返回最低位1的值 8 return x & -x; 9 } 10 11 void add(int x, int d){//将d累加到tree数组对应

P3374 【模板】树状数组 1

P3374 [模板]树状数组 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接下来M行每行包含3或4个整数,表示一个操作,具体如下: 操作1: 格式:1 x k 含义:将第x个数加上k 操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和 输出格式: 输出包

luogu P3368 【模板】树状数组 2

P3368 [模板]树状数组 2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接下来M行每行包含2或4个整数,表示一个操作,具体如下: 操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k 操作2: 格式:2 x 含义:输出第x个数的值 输出格式: 输出

洛谷 P3368 【模板】树状数组 2

题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接下来M行每行包含3或4个整数,表示一个操作,具体如下: 操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k 操作2: 格式:2 x 含义:输出第x个数的值 输出格式: 输出包含若干行整数,即为所有操作2的结