1081 线段树练习 2 codevs
2017-03-06 20:36
471 查看
1081 线段树练习 2 codevs
题目描述 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
对于每个询问输出一行一个答案
样例输入 Sample Input
3
1
2
3
2
1 2 3 2
2 3
样例输出 Sample Output
5
数据范围及提示 Data Size & Hint
数据范围
1<=n<=100000
1<=q<=100000
代码如下
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <queue> #include <stack> #include <vector> #include <list> #include<sstream> #include<ctime> using namespace std; const int N=100005; int a ,n,m; int lowbit(int x) { return x&-x; } int sum(int x) { int s=0; while(x>0) { s+=a[x]; x=x-lowbit(x); } return s; } void add(int x,int date) { while(x<=n) { a[x]+=date; x=x+lowbit(x); } } int main() { memset(a,0,sizeof(a)); cin>>n; int r; for(int i=1;i<=n;i++) { cin>>r; add(i,r); } cin>>m; int x,y,z,t; for(int i=1;i<=m;i++) { cin>>t; if(t==1) { cin>>x>>y>>z; for(int j=x;j<=y;j++) add(j,z); } else { cin>>x; cout<<sum(x)-sum(x-1)<<endl; } } return 0; }
相关文章推荐
- 【codevs 1081】线段树练习2(单点查询+区间修改)
- CODEVS 1081线段树练习2
- CODEVS 1081 线段树练习 2
- codevs 1081 线段树练习 2 区间更新 单点查询 无lazy
- codevs 1081 线段树练习 2
- 【codevs 1081】线段树练习 2
- 1081 线段树练习 2
- CODEVS 1081 线段树区间修改
- [Codevs] 1081 线段树练习 2 ----“分块!”
- T1080 线段树练习 codevs
- T1081 线段树练习 2 codevs
- 1081 线段树练习 2
- CodeVS 1080 线段树练习 分块 块状数组
- T1082 线段树练习3 codevs
- codevs 4927 线段树练习5
- Codevs 1081 线段树练习2
- 【codevs 1082】线段树练习 3
- CODEVS-1082-线段树练习3-splay
- Codevs 4927 线段树练习5
- 【codevs 1082】线段树练习3