树状数组基本模版(区间更新,单点查询)

题目描述

如题,已知一个数列,你需要进行下面两种操作:

1.将某区间每一个数数加上x

2.求出某一个数的和

输入输出格式

输入格式:

第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。

第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。

接下来M行每行包含2或4个整数,表示一个操作,具体如下:

操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k

操作2: 格式:2 x 含义:输出第x个数的值

输出格式:

输出包含若干行整数,即为所有操作2的结果。

输入输出样例

输入样例#1:

5 5
1 5 4 2 3
1 2 4 2
2 3
1 1 5 -1
1 3 5 7
2 4
 1 #include<bits/stdc++.h>
 2 #define maxn 1000007
 3 using namespace std;
 4
 5 int n,m;
 6 int c[maxn],a[maxn];
 7
 8 int lowbit(int k)
 9 {
10         return k&(-k);
11 }
12 void Update(int k,int num)
13 {
14     if(k==0) return ;
15     while(k<=n)
16     {
17         c[k]+=num;
18         k+=lowbit(k);
19     }
20     return;
21
22 }
23 int  Sum(int k)
24 {
25     int ans=0;
26     while(k>0)
27     {
28         ans+=c[k];
29         k-=lowbit(k);
30     }
31     return ans;
32 }
33
34 int main()
35 {
36     ios::sync_with_stdio(false);
37     cin>>n>>m;
38     int t;
39     for(int i=1;i<=n;i++)
40     {
41           cin>>a[i];
42        Update(i,a[i]);
43        Update(i+1,-a[i]);
44     }
45     int t1,t2,t3,t4;
46
47     for(int i=1;i<=m;i++)
48     {
49         cin>>t1;
50         if(t1==1)
51         {cin>>t2>>t3>>t4;Update(t2,t4);Update(t3+1,-t4);}
52         if(t1==2)
53         {cin>>t2; cout<<Sum(t2)<<endl;}
54     }
55     return 0;
56 }
时间: 2024-12-18 03:01:48

树状数组基本模版(区间更新,单点查询)的相关文章

树状数组模板(区间修改+单点查询)

很巧妙的用了差分建树,解决区间修改的问题 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn=5e5+5; 5 6 int n,m; 7 int a[maxn]; 8 ll tree[maxn]; 9 10 int lowbit(int x){ 11 return x&(-x); 12 } 13 14 void add(int idx,int v){ 15

POJ2155 Matrix 【二维树状数组】+【段更新点查询】

Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17766   Accepted: 6674 Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. Initially we have A[i, j] = 0 (1

POJ 2155 Matrix【二维树状数组+YY(区间更新,单点查询)】

题目链接:http://poj.org/problem?id=2155 Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 32950   Accepted: 11943 Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th col

HDU1556 Color the ball【树状数组】【区间更新】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1556 题目大意: N个气球排成一排,从左到右编号为1~N,给N组数据,每次给2两个整数s,e,表示从s到e将 气球涂色.当涂到N次以后已经忘记了第i个气球被涂过几次颜色了.现在来计算出每个气球被 涂了几次颜色,并输出出来. 思路: 典型的更新区间,单点求值问题.直接模拟会超时,考虑用树状数组来做.单点更新中,树状 数组表示区间的和.在区间更新中,树状数组表示单个元素的变化. 这道题中,区间(s,e

Wikioi 2492 树状数组+并查集(单点更新区间查询)

刚开始做的时候用线段树做的,然后就跳进坑里了--因为要开方,所以区间的值都得全部变,然后想用lazy标记的,但是发现用不了,单点更新这个用不了,然后就不用了,就T了.然后实在不行了,看了别人的题解,原来是用树状数组+并查集的方法,唉--没想到啊! 因为开方之后多次那个数就会变成1了,所以是1的时候开方下去就没用了.树状数组更新的时候就把其更新的差更新即可,太机智了这题-- 昨天做了,然后出错找了好久都找不出来,原来是把s[i]写成c[i]了,然后答案一直错,晕-- #include <iostr

树状数组模板(持续更新)

树状数组题目(持续更新) \(1.\) 树状数组 \(1\) :单点修改,区间查询 \(2.\) 树状数组 \(2\) :区间修改,单点查询 \(3.\) 树状数组 \(3\) :区间修改,区间查询 树状数组单点修改,区间查询和 $View$ $Code$ //省略头文件 using namespace std; inline int read() { int ret=0,f=1; char ch=getchar(); while(ch>'9'||ch='0'&&ch 树状数组区间修

codevs 1081 线段树练习 2 区间更新 单点查询 无lazy

题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所有数都增加X 2:询问第i个数是什么? 输入描述 Input Description 第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,表示操作的个数. 接下来Q行每行若干个整数.如果第一个数是1,后接3个正整数a,b,X,表示在区间[a,b]内每个数增加X,如果是2,后面跟1个整数i, 表示询问第i个位置的数是多少. 输出描述 Output Description 对于每个询问输出一行一个答案 样例输

Light OJ 1080 - Binary Simulation - (线段树区间更新 单点查询)

Description Given a binary number, we are about to do some operations on the number. Two types of operations can be here. 'I i j'    which means invert the bit from i to j (inclusive) 'Q i'    answer whether the ith bit is 0 or 1 The MSB (most signif

poj 2155 区间更新 单点查询

Matrix Time Limit: 3000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row