【题目描述】
给定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; }