Cod sursa(job #367743)

Utilizator GotenAmza Catalin Goten Data 23 noiembrie 2009 12:58:24
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<fstream.h>
long n,m;
int c[100001],a;


void adunare(int i, int x)
{
 int k=0;
 while(i<=n)
 {
  c[i]+=x;
  while((i&(1<<k))==0)k++;
  i+=(1<<k);
  k++;
  }
}

int suma(int i)
{
 int s=0,k=0;
 while(i>0)
  {
   s+=c[i];
   while((i&(1<<k))==0)k++;
   i-=(1<<k);
   k++;
   }
 return s;
 }


void creare(int i)
{
 int k=0;
 c[i]+=a;
 while((i&(1<<k))==0)k++;
 c[i]+=(suma(1,i-1)-suma(1,i-(1<<k)));
 }

int cautare(int x)
{int p=1;int k=0;
while(p<=n)p<<=1;
while(p)
  { if(k+p <=n)
     {
     if(x>=c[k+p])
       {k+=p;
       x-=c[k];
	if(!x)return k;
	}}
  p>>=1;
  }
  return -1;
  }


int main()
{
 int i,op,x,y,gasit,s,d,m,mij;
 ifstream f("aib.in");
 ofstream g("aib.out");
 f>>n>>m;
 for(i=1;i<=n;i++) 
{f>>a;
 creare(i);}
 for(i=1;i<=m;i++)
 {
   f>>op;
   if(op==0)
   {
   f>>x>>y;
   adunare(x,y);
   }
   else if(op==1)
       {
	f>>x>>y;
	g<<suma(y)-suma(x-1)<<'\n';
	}
       else
	{
	 f>>x;
	 g<<cautare(x)<<'\n';
	 }
 }
 return 0;
 }