Cod sursa(job #429963)

Utilizator za_wolfpalianos cristian za_wolf Data 30 martie 2010 17:32:02
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
//#include "stdafx.h"
#include<stdio.h>
#define NMAX 100100
int x[NMAX],a,b,c,n,m,i;
int zero(int a)
{
	return (a^(a-1))&a;
}
void tip1(int a, int b)
{
	while (a<=n)
	{
		x[a]+=b;
		a+=zero(a);
	}
}
int tip2(int a)
{
	int s=0;
	while (a)
	{
		s+=x[a];
		a-=zero(a);
	}
	return s;
}
int tip3(int a)
{
	int in=1,sf=n,m;
	while (in<=sf)
	{
		m=(in+sf)>>1;
		if (tip2(m)<a)
			in=m+1;
		else
			sf=m-1;
	}
	sf++;
	m=tip2(sf);
	if (m!=a)
		return -1;
	else
		return sf;

}
int main()
{
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (i=1;i<=n;i++)
	{
		scanf("%d",&a);
		tip1(i,a);
	}
	for (i=1;i<=m;i++)
	{
		scanf("%d",&a);
		if (a==0)
		{
			scanf("%d%d",&b,&c);
			tip1(b,c);
		} else
		if (a==1)
		{
			scanf("%d%d",&b,&c);
			printf("%d\n",tip2(c)-tip2(b-1));
		} else
		if (a==2)
		{
			scanf("%d",&b);
			printf("%d\n",tip3(b));
		}
	}

	return 0;
}