子数列连续和

问题 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)。

输出

输出若干行数字,表示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;
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/czy-power/p/10357688.html