Cod sursa(job #1240552)

Utilizator drobertDumitru Robert drobert Data 11 octombrie 2014 16:43:11
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <fstream>
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");

int n,m,k,x,y,v[100001];

void add(int poz,int val)
{
	int t=0;
	while (poz<=n)
	{
		v[poz]+=val;
		while (!(poz&1<<t))
			t++;
		poz+=1<<t;
		t++;
	}
}

int find(int poz)
{
	int s=0,t=0;
	while(poz>0)
	{
		s+=v[poz];
		while (!(poz&1<<t))
			t++;
		poz-=1<<t;
		t++;
	}
	return s;
}

int findmin(int s)
{
	int i,t;
	for (t=1;t<n;t<<=1);
	for (i=0;t;t>>=1)
	{
		if (i+t<=n)
			if (v[i+t]<=s)
			{
				i+=t;
				s-=v[i];
				if (!s)
					return i;
			}
	}
	return -1;
}

int main()
{
	int i;
	cin>>n>>m;
	for (i=1;i<=n;i++)
	{
		cin>>x;
		add(i,x);
	}
	for (i=1;i<=m;i++)
	{
		cin>>k;
		if (!k)
		{
			cin>>x>>y;
			add(x,y);
		}
		else if (k==1)
		{
			cin>>x>>y;
			cout<<find(y)-find(x-1)<<'\n';
		}
		else
		{
			cin>>x;
			cout<<findmin(x)<<'\n';
		}
	}
}