Cod sursa(job #713508)

Utilizator iuli1505Parasca Iuliana iuli1505 Data 14 martie 2012 18:34:09
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<cstdio>
#define nmax 100010
using namespace std;
int n,m,v[nmax],cod,a,b,x;
void upd(int poz, int val)
{
	int z=0;
    while(poz<=n)
    {
        v[poz]+=val;
        while(!(poz&(1<<z)))
			z++;
        poz+=(1<<z);
        z++;
    }
}
int sum(int poz)
{
    int z,S;
	z=0;
	S=0;
    while(poz>0)
    {
		S+=v[poz];
		while(!(poz&(1<<z))) 
			z++;
        poz-=(1<<z);
        z++;
    }
    return S;
}
int elem(int val)
{
    int i,j;
    for(j=1;j<n;j*=2); 
    for(i=0;j;j/=2)
    {
		if(i+j<=n)
        {
            if(val>=v[i+j]) 
            {
                i+=j;
				val-=v[i];
                if(!val) 
					return i;
            }
		}
    }
    return -1;
}
int main()
{
	int i;
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%d%d", &n, &m);
	for(i=1;i<=n;i++)
	{
		scanf("%d", &x);
		upd(i,x);
	}
	for(i=1;i<=m;i++)
	{
		scanf("%d", &cod);
		if(cod<2)
		{
			scanf("%d%d", &a, &b);
			if(!cod)
				upd(a,b);
			else
				printf("%d\n", sum(b)-sum(a-1));
		}
		else
		{
			scanf("%d", &a);
			printf("%d\n", elem(a));
		}
	}
	return 0;
}