Cod sursa(job #488142)

Utilizator Cristi09Cristi Cristi09 Data 27 septembrie 2010 19:44:42
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<stdio.h>
int aib[100001], n, m;
int bit(int x)
{
	return (x&(x-1))^x;
}
void add(int a,int b)
{
	int i;
	
	for(i = a; i<=n ; i += bit(i))
	{
		aib[i] += b;
	}
}
int sum(int a,int b)
{
	int s1,s2,i;
	for(i = b,s1 = 0; i>=1 ; i-=bit(i))
	{
		s1 += aib[i];
	}
	for(i = a-1,s2 = 0; i>=1 ; i-=bit(i))
	{
		s2 += aib[i];
	}
	return s1-s2;
}
int search(int a)
{
	int k,i,s;
	for(i=1 ; i<=n ; ++i)
	{
		s = sum(1,i);
		if(s == a)return i;
		if(s > a)return -1;
	}
	return -1;
}
int main()
{
	int a,b,tip;
	FILE*f = fopen("aib.in","r");
	FILE*g = fopen("aib.out","w");
	
	fscanf(f,"%d %d",&n,&m);
	
	for(a = 1; a<=n ; ++a)
	{
		fscanf(f,"%d",&b);
		add(a,b);
	}
	while(m--)
	{
		fscanf(f,"%d ",&tip);
		if(tip == 0)
		{
			fscanf(f,"%d %d",&a,&b);
			add(a,b);
		}
		if(tip == 1)
		{
			fscanf(f,"%d %d",&a,&b);
			fprintf(g,"%d\n",sum(a,b));
		}
		if(tip == 2)
		{
			fscanf(f,"%d ",&a);
			fprintf(g,"%d\n",search(a));
		}
	}
	fclose(f);
	fclose(g);
	return 0;
}