Cod sursa(job #402506)

Utilizator nautilusCohal Alexandru nautilus Data 23 februarie 2010 21:57:02
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 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;
}


long minim(long s)
{
 int i,j;
  
 for(j=1; j<n; j<<=1); /*j este cea mai mica putere a lui 2 mai mare sau egal cu n (shiftez la stanga)*/
 
 for(i=0; j; j>>=1) /*shiftez la dreapta*/
     if (i+j<=n && c[i+j]<=s)
	   {
 		i=i+j;
		s=s-c[i];
	   }
	
 if (s || i<1)
 	 return -1; else
	 return i;
}

int main()
{
 long m,i,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;
				   fout<<suma(x-1,y)<<'\n';
			  } else
			  {		/*determinare poz minima*/
			   fin>>x; 
			   fout<<minim(x)<<'\n';
			  }
	 }
 
 fin.close();
 fout.close();
 
 return 0;
}