如题,已知一个数列,你需要进行下面两种操作:
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
样例说明:
故输出结果为6、10
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 using namespace std;
6 int lowbit(int x)
7 {return x&-x;}
8 void read(int & n)
9 {
10 char c='+';int x=0;bool flag=0;
11 while(c<'0'||c>'9')
12 {c=getchar();if(c=='-')flag=1;}
13 while(c>='0'&&c<='9')
14 {x=x*10+(c-48),c=getchar();}
15 flag==1?n=-x:n=x;
16 }
17 const int MAXN=500001;
18 int c[MAXN],n,m,p,x,y,z,pre;
19 void add(int p,int v)
20 {
21 while(p<=n)
22 {
23 c[p]+=v;
24 p+=lowbit(p);
25 }
26 }
27 int ask(int p)
28 {
29 int ans=0;
30 while(p>0)
31 {
32 ans+=c[p];
33 p-=lowbit(p);
34 }
35 return ans;
36 }
37 int main()
38 {
39 read(n);read(m);
40 for(int i=1;i<=n;i++)
41 {
42 read(p);
43 add(i,p-pre);
44 pre=p;
45 }
46
47 while(m--)
48 {
49 read(p);
50 if(p==1)// 区间加
51 {
52 read(x);read(y);read(z);
53 add(x,z);
54 add(y+1,-z);
55 }
56 else// 单点查询
57 {
58 read(x);
59 printf("%d\n",ask(x));
60 }
61 }
62 return 0;
63 }