问题 A: 子数列连续和
时间限制: 1 Sec 内存限制: 128 MB提交: 25 解决: 16
[提交] [状态] [讨论版] [命题人:admin]
题目描述
给定n个数列,规定有两种操作,一是修改某个元素,二是求子数列[a,b]的连续和。数列的元素个数最多10万个,询问操作最多10万次。
输入
第一行2个整数n,m(n表示输入n个数,m表示有m个操作)
第二行输入n个数列。
接下来m行,每行有三个数k,a,b(k=0表示求子数列[a,b]的和;k=1表示第a个数加b)。
第二行输入n个数列。
接下来m行,每行有三个数k,a,b(k=0表示求子数列[a,b]的和;k=1表示第a个数加b)。
输出
输出若干行数字,表示k=0时,对应的子数列[a,b]的连续和。
样例输入
10 5
1 2 3 4 5 6 7 8 9 10
1 1 5
0 1 3
0 4 8
1 7 5
0 4 8
样例输出
11
30
35
#include<bits/stdc++.h> #include<queue> #include<cstdio> #include<cstring> #include<cmath> #include<map> #include<iostream> #define REP(i, a, b) for(int i = (a); i <= (b); ++ i) #define REP(j, a, b) for(int j = (a); j <= (b); ++ j) #define PER(i, a, b) for(int i = (a); i >= (b); -- i) using namespace std; const int maxn = 1e7 + 5; int n, k,p[maxn],m,x; int lowbit(int a) { return a & (-a); } void add(int pos,int w) { while (pos <= n) { p[pos] += w, pos += lowbit(pos); } } int sum(int pos) { int tot=0; while (pos) { tot += p[pos]; pos -= lowbit(pos); } return tot; } int main(){ cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> x; add(i, x); } while (m--) { int x, u, v; cin >> x >> u >> v; if (x) { add(u, v); } else { cout << sum(v) - sum(u - 1) << endl; } } }