UESTC 838 母仪天下(树状数组)

思路:树状数组裸题


#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000+500;
int c[maxn],a[maxn];
int lowbit(int x){return x&(-x);}
void update(int i,int d)
{
    while(i<maxn)
	{
		c[i]+=d;
		i+=lowbit(i);
	}
}
int query(int i)
{
	int ans = 0;
	while(i)
	{
		ans+=c[i];
		i-=lowbit(i);
	}
	return ans;
}
int main()
{
    int n,m;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
	    for(int i = 1;i<=n;i++)
		   scanf("%d",&a[i]),update(i,a[i]);
		for(int i = 1;i<=m;i++)
		{
			int op,a,b;
			scanf("%d%d%d",&op,&a,&b);
			if(op==1)
                update(a,b);
			else
			    printf("%d\n",query(b)-query(a-1));
		}
	}
}


Description

富庶的建业城中,有一条格格不入的长街,名曰跳蚤街,被战争所致的孤儿,聚集于此。全国的经济都在为战争服务之时,也无人顾得了这里了。

除了两位夫人。

大乔小乔每天都会带着一些食物来到跳蚤街,分给某一位孩子。为了避免分配不均,她们时常会询问一个区域内食物的总量,然后进行调整以保证每个孩子都有足够的食物。

Input

第一行两个整数$n$,$m$,表示跳蚤街住着$n$户孩子,大乔小乔一共分发或询问了$m$次。

第二行$n$个整数,第$i$个数$a_i$表示第$i$户孩子已有$a_i$的食物。

接下来$m$行,每行开始先读入一个整数$s_i$,指明这是一次询问还是一次分发。

$s_i = 0$,表明这是一次询问,然后读入两个整数$l_i,r_i$,表示询问$[l_i,r_i]$区间中的孩子们一共有多少食物。

$s_i = 1$,表明这是一次分发,然后读入两个整数$x_i,w_i$,表示对第$x_i$户孩子分发了$w_i$的食物。

$1\leq n,m\leq100000,0\leq a_i \leq 100000,1\leq x_i \leq n ,0 \leq w_i \leq 10000,1\leq l_i \leq r_i \leq n$

Output

有多少询问就输出多少行,每行输出一个整数,作为对该询问的回答。

Sample Input

5 4 
1 2 3 4 5 
1 2 3 
0 2 4 
1 4 1 
0 1 5

Sample Output

12 
19



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值