Cod sursa(job #1396761)

Utilizator LycrsTrifan Tamara Lycrs Data 22 martie 2015 23:06:32
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include<string>

using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");

int n, i, j, m, a, b, T[100005], x, y, k, o;

void Update(int idx, int val){
	
	while (idx<=n)
		{
			T[idx]+=val;
			idx+=idx & -idx;
		}
}

int Del(int y, int x){
	int s=0;
	
	while(x)
	{
		s+=T[x];
		x-=x & -x;
	}
	
	--y;
	while(y)
	{
		s-=T[y];
		y-=y & -y;
	}
	
	return s;
}

int main()
{
	cin>>n>>m;
	
	for(i=1; i<=n; ++i)
		cin>>x, Update(i, x);
		
	for(i=1; i<=m; ++i){
		cin>>o;
		if (o==0)
			cin>>a>>b,
			Update(a, b);
		else if(o==1)
			cin>>a>>b,
			cout<<Del(a, b)<<'\n';
		else if(o==2)
		{
			cin>>a;
			x=1; y=n; b=0;
			while (x<=y && b==0)
			{
				int m=(x+y)/2, F=0;
				k=m;
				while(k)
				{
					F+=T[k];
					k-=k & -k;
				}
				
				if (a==F) b=m;
				else if (a<F)
						y=m-1;
				else if (a>F)
						x=m+1;
			}
			if (b==0) b=-1;
			cout<<b<<'\n';
		}
	}
			
	return 0;
}