P3368 【模板】树状数组 2(树状数组维护差分序列)
2017-06-26 15:39
363 查看
题目描述
如题,已知一个数列,你需要进行下面两种操作: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:
6 10
说明
时空限制:1000ms,128M数据规模:
对于30%的数据:N<=8,M<=10
对于70%的数据:N<=10000,M<=10000
对于100%的数据:N<=500000,M<=500000
样例说明:
![](https://cdn.luogu.org/upload/pic/2258.png)
故输出结果为6、10
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; int lowbit(int x) {return x&-x;} void read(int & n) { char c='+';int x=0;bool flag=0; while(c<'0'||c>'9') {c=getchar();if(c=='-')flag=1;} while(c>='0'&&c<='9') {x=x*10+(c-48),c=getchar();} flag==1?n=-x:n=x; } const int MAXN=500001; int c[MAXN],n,m,p,x,y,z,pre; void add(int p,int v) { while(p<=n) { c[p]+=v; p+=lowbit(p); } } int ask(int p) { int ans=0; while(p>0) { ans+=c[p]; p-=lowbit(p); } return ans; } int main() { read(n);read(m); for(int i=1;i<=n;i++) { read(p); add(i,p-pre); pre=p; } while(m--) { read(p); if(p==1)// 区间加 { read(x);read(y);read(z); add(x,z); add(y+1,-z); } else// 单点查询 { read(x); printf("%d\n",ask(x)); } } return 0; }
相关文章推荐
- 树状数组的讲解感觉挺好,和我的一维,二维,树状数组的模板,希望对大家有用
- bzoj2124 等差子序列 (树状数组 维护hash值)
- 康托展开模板(树状数组维护)O (n log n)
- [BZOJ1103][POI2007]大都市meg(树状数组维护树上差分)
- hdu 3584 二进制0,1反转 三维树状数组 及三维树状数组模板
- SSL2845 2017年11月8日提高组T2 序列操作(贪心,树状数组,差分)
- 洛谷 P3368 树状数组【模板2】
- 【树状数组】树状数组一维二维模板
- BZOJ1103 大都市 DFS序 树状数组维护差分数组
- poj 1195 二维树状数组 及二维树状数组模板
- POJ 1743 - Musical Theme 后缀数组模板+用后缀数组求不覆盖最长重复子序列
- POJ 3321 Apple Tree(后根遍历将树转化成序列,用树状数组维护)
- hdu 2642二维树状数组 单点更新区间查询 模板题
- hdu 2642二维树状数组 单点更新区间查询 模板题
- hdu 2642 二维树状数组 单点更新区间查询 模板水题
- sgu 180. Inversions (树状数组+离散化,第一道需要改模板的题目,好题)
- HDU 4638 多校第四场1007 离线询问,树状数组||线段树维护
- 树状数组、线段树模板(一)——单点更新 + HDU 1166 敌兵布阵
- hdu 4267 A Simple Problem with Integers(分类别维护多个树状数组)
- 树状数组模板区间更新 区间询问