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)); } }