题目描述
如题,已知一个数列,你需要进行下面两种操作:
1.将某一个数加上x
2.求出某区间每一个数的和
输入输出格式
输入格式:
第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。
第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。
接下来M行每行包含3个整数,表示一个操作,具体如下:
操作1: 格式:1 x k 含义:将第x个数加上k
操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和
输出格式:
输出包含若干行整数,即为所有操作2的结果。
输入输出样例
说明
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=8,M<=10
对于70%的数据:N<=10000,M<=10000
对于100%的数据:N<=500000,M<=500000
样例说明:
故输出结果14、16

1 #include <iostream> 2 #include <string.h> 3 #include <algorithm> 4 #include <stack> 5 #include <string> 6 #include <math.h> 7 #include <queue> 8 #include <stdio.h> 9 #include <string.h> 10 #include <vector> 11 #include <fstream> 12 #include <set> 13 #define lowbit(x) x&(-x) 14 15 using namespace std; 16 int n, m; 17 const int maxn = 500005; 18 int num[maxn],sum[maxn],c[maxn]; 19 20 void build() { 21 for (int x = 1; x <= n; x++) 22 { 23 sum[x] = sum[x - 1] + num[x]; 24 int lowb = lowbit(x); 25 c[x] = sum[x] - sum[x - lowb]; 26 } 27 } 28 29 void change(int x,int k) { 30 while (x <= n) { 31 c[x] =c[x]+k; 32 x += lowbit(x); 33 } 34 } 35 36 int getsum(int x) { 37 int sum=0; 38 while (x > 0) { 39 sum = sum + c[x]; 40 x -= lowbit(x); 41 } 42 return sum; 43 } 44 45 void query(int x, int y) { 46 int sumx, sumy; 47 sumx = getsum(x-1), sumy = getsum(y); 48 int res = sumy - sumx; 49 printf("%d ", res); 50 } 51 52 void init() { 53 scanf("%d%d", &n, &m); 54 for (int i = 1; i <= n; i++) { 55 int x; 56 scanf("%d", &x); 57 num[i] = x; 58 } 59 build(); 60 while (m--) { 61 int oper; 62 scanf("%d", &oper); 63 if (oper == 1) { 64 int x, k; 65 scanf("%d%d", &x, &k); 66 change(x, k); 67 } 68 else { 69 int x, y; 70 scanf("%d%d", &x, &y); 71 query(x, y); 72 } 73 } 74 } 75 76 int main() 77 { 78 init(); 79 return 0; 80 }
原来高性能跟高精度不是一个意思?!