Cod sursa(job #402421)

Utilizator nautilusCohal Alexandru nautilus Data 23 februarie 2010 20:56:13
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<fstream.h>
#define dmax 100002

long n,c[dmax];

void adaugare(long ind, long val)
{
 long poz;
	
 poz=0;
 while (ind<=n)
	 {
	  c[ind]=c[ind]+val;
	  while ((ind & 1<<poz) == 0)
		  poz++;
	  ind=ind+(1<<poz);
	  poz++;
	 }
}

long suma(long st, long dr)
{
 long s1,s2,poz;
	
 s1=0; poz=0;
 while (dr>0)
	 {
	  s1=s1+c[dr];
	  while ((dr & 1<<poz) == 0)
		  poz++;
	  dr=dr-(1<<poz);
	  poz++;
	 }
 
 s2=0; poz=0;
 while (st>0)
	 {
	  s2=s2+c[st];
	  while ((st & 1<<poz) == 0)
		  poz++;
	  st=st-(1<<poz);
	  poz++;
	 }
 
 return s1-s2;
}

int main()
{
 long m,i,j,x,op,poz,y;	

 ifstream fin("aib.in");
 fin>>n>>m;
 for (i=1; i<=n; i++)
	 {
	  fin>>x;
	  adaugare(i,x);
	 }
 
 ofstream fout("aib.out");
 
 for (i=1; i<=m; i++)
	 {
	  fin>>op;
	  if (op==0) /*adaugare*/
		  {
		   fin>>poz>>x;
		   adaugare(poz,x);
		  } else
		  if (op==1) /*afisare suma*/
			  {
			   fin>>x>>y;
		       /*if (x!=y)
				   fout<<suma(x,y)<<'\n'; else*/
				   fout<<suma(x-1,y)<<'\n';
			  } else
			  {		/*determinare poz minima*/
			   fin>>x;
			   for (j=1; j<=n; j++)
				   if (suma(0,j)==x)
					   {
					    fout<<j<<'\n';
						break;
					   }
			  }
	 }
 
 fin.close();
 fout.close();
 
 return 0;
}