列表

详情


NC50427. 数列操作

描述

这是一道模板题。
给定数列,你需要依次进行q个操作,操作有两类:
  • 1 i x:给定i,x,将a[i]加上x;
  • 2 l r:给定l,r,求的值(换言之,求的值)。

输入描述

第一行包含2个正整数n,q,表示数列长度和询问个数。保证
第二行n个整数,表示初始数列。保证
接下来q行,每行一个操作,为以下两种之一:
1 i x:给定i,x,将a[i]加上x;
2 l r:给定l,r,求的值。保证

输出描述

对于每个2lr操作输出一行,每行有一个整数,表示所求的结果。

示例1

输入:

3 2
1 2 3
1 2 0
2 1 3

输出:

6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 584ms, 内存消耗: 16324K, 提交时间: 2021-05-26 14:00:11

#include<bits/stdc++.h>
#define low(i) (i&(-i))
typedef long long ll;
using namespace std;
const int nn=1e6+7;;
int opt,n,m,x,y;
ll c[nn];
void add(int p,int v){for(;p<=n;p+=low(p))c[p]+=v;}
ll pre(int p){
	ll ans=0;
	for(;p;p-=low(p))ans+=c[p];
	return ans;
}int main(){
	scanf("%d%d",&n,&m);
	for(int i=1,a;i<=n;i++)
		scanf("%d",&a),add(i,a);
	while(m--){
		scanf("%d%d%d",&opt,&x,&y);
		if(opt==1) add(x,y);
		else printf("%lld\n",pre(y)-pre(x-1));
	}return 0;
}

上一题