Cod sursa(job #245598)

Utilizator EstiarteManuel Esanu Estiarte Data 18 ianuarie 2009 13:23:26
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<stdio.h>
long int n,m,c[100001],k;
FILE *in=fopen("aib.in","r");
FILE *out=fopen("aib.out","w");
void adauga(long int poz,long int val)
{
 long int i,nr;
 while(poz<=n)
 {
	c[poz]=c[poz]+val;
	i=poz;
	nr=1;
	while(!(i&1))
	{
	 i=i>>1;
	 nr=nr<<1;
	}
	poz=poz+nr;
 }
}
void citire()
{
 fscanf(in,"%ld",&n);
 fscanf(in,"%ld",&m);

 long int i,a;
 for(i=1;i<=n;i++) c[i]=0;
 for(i=1;i<=n;i++)
 {
	fscanf(in,"%ld",&a);
	adauga(i,a);
 }
}
long int suma(int poz)
{
 long int s,i,nr;
 s=0;
 while(poz>0)
 {
	s=s+c[poz];
	i=poz;nr=1;
	while(!(i&1))
	{
	 i=i>>1;
	 nr=nr<<1;
	}
	poz=poz-nr;
 }
 return s;
}
long int elemente(long int val)
{
 long int i,nr;
 for(nr=1;nr<n;nr=nr<<1);

 for(i=0;nr;nr=nr>>1)
 {
	if(val>=c[i+nr])
	{
	 i=i+nr;
	 val=val-c[i];
	 if(val==0) return i;
	}
 }
 return -1;
}
void solutie()
{
 long int i,op,poz,val;
 for(i=1;i<=m;i++)
 {
	fscanf(in,"%ld",&op);
	if(op==0)
	{
		fscanf(in,"%ld",&poz);
		fscanf(in,"%ld",&val);
		adauga(poz,val);
	}
	if(op==1)
	{
	 fscanf(in,"%ld",&poz);
	 fscanf(in,"%ld",&val);
	 fprintf(out,"%ld\n",suma(val)-suma(poz-1));
	}
	if(op==2)
	{
	 fscanf(in,"%ld",&k);
	 fprintf(out,"%ld\n",elemente(k));
	}
 }
}
int main(void)
{
 citire();
 solutie();
 return 1;
}