1. 程式人生 > >Big Water Problem——牛客網競賽(樹狀陣列)

Big Water Problem——牛客網競賽(樹狀陣列)

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld

題目描述

給一個數列,會有多次詢問,對於每一次詢問,會有兩種操作: 1:給定兩個整數x, y, 然後在原陣列的第x位置上加y; 2:給定兩個整數l,r,然後輸出陣列從第l位加到第r位數字的和並換行

輸入描述:

第一行有兩個整數n, m(1 <= n, m <= 100000)代表數列的長度和詢問的次數
第二行n個數字,對於第i個數字a[i],(0<=a[i]<=100000)。
接下來m行,每一行有三個整數f, x, y。第一個整數f是1或者是2,代表操作型別,如果是1,接下來兩個數x,y代表第x的位置上加y,如果是2,則求x到y的和,保證資料合法。

輸出描述:

輸出每次求和的結果並換行
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[100005];
int i,j,rex,x,y,r,l,f,n,m;
int lowbit(int x)
{
	return x&-x; 
} 
void add(int n,int m){
	while(n<100005)
	{
		a[n]+=m;
		n+=lowbit(n);
	}
}
int sum(int n){
	rex=0;
	while(n>0)
	{
		rex+=a[n];
		n-=lowbit(n);
	}
	return rex;
}
int main()
{
	cin>>n>>m;
	memset(a,0,sizeof(a));
	for(i=1;i<=n;i++)
	{
		cin>>l;
		add(i,l);
	}
	for(i=1;i<=m;i++)
	{
		cin>>l>>x>>y;
		if(l==1)
		{
			add(x,y);
		}
		else
		{
			cout<<sum(y)-sum(x-1)<<endl;
		}
	}
	return 0;
}