#10113 「一本通 4.1 例 1」数列操作

1535:【例 1】数列操作


时间限制: 1000 ms         内存限制: 262144 KB
提交数: 690     通过数: 446 

【题目描述】

给定nn个数列,规定有两种操作,一是修改某个元素,二是求子数列[a,b][a,b]的连续和。数列元素个数最多1010万个,询问操作最多1010万次。

【输入】

第一行22个整数n,mn,m(nn表示输入nn个数,mm表示mm操作)

第二行nn个整数

接下来mm行,每行三个数k,a,bk,a,b(k=0k=0,表示求子数列[a,ba,b]的连续和;k=1k=1,表示第aa个数加bb)。

【输出】

若干行,表示k=0k=0时,对应子数列[a,ba,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>
using namespace std;
int s[100005];
int lowbit(int x){return x&(-x);}
int sum(int x){
    int res=0;
    while(x>0){res+=s[x];x-=lowbit(x);}
    return res;
}
int main(){
    //freopen("test.in","r",stdin);
    int n,m,k,a,b;
    scanf("%d%d",&n,&m);
    for(a=1;a<=n;a++){
        scanf("%d",&k);
        for(b=a;b<=n;b+=lowbit(b))s[b]+=k;
    }
    while(m--){
        scanf("%d%d%d",&k,&a,&b);
        if(k)
            for(;a<=n;a+=lowbit(a))s[a]+=b;
        else
            printf("%d\n",sum(b)-sum(a-1));
    }
}

 

猜你喜欢

转载自www.cnblogs.com/fdezlsq/p/11432264.html