1535:【例 1】数列操作

【题目描述】

给定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 n,m;
const int N=1e5+10;
int a[N];
int lowbit(int x)
{
    return x&(-x);
}

int sum(int x)
{
    int ans=0;
    for(int i=x;i>0;i-=lowbit(i)){
        ans+=a[i];
    }
    return ans;
}

void updata(int x,int y)
{
    for(int i=x;i<=n;i+=lowbit(i)){
        a[i]+=y;
    }
}
int main()
{
    while(scanf("%d %d",&n,&m)==2){
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++){
            int x;
            scanf("%d",&x);
            updata(i,x);
        }
        while(m--){
            int k,x,y;
            scanf("%d %d %d",&k,&x,&y);
            if(k==1){
                updata(x,y);
            }
            else{
                printf("%d\n",sum(y)-sum(x-1));
            }
        }

    }
    return 0;
}

 

posted @ 2018-12-26 14:59  12-num  阅读(701)  评论(0编辑  收藏  举报