Cod sursa(job #782355)

Utilizator AndupkIonescu Alexandru Andupk Data 26 august 2012 23:41:00
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<fstream>
using namespace std;
int c[1000],n,i,x,m;
void update(int ind,int val)
{
 int k=0;
 while(ind<=n)
 {    
  c[ind]+=val;
  while(!(ind & 1<<k)) k++;
   ind+=(1<<k); 
   k++;
 }
}
int sum(int ind)
{
  int s=0,k;
  while(ind>0)
  {
    s+=c[ind];
	while(!(ind & 1<<k)) k++;
	ind-=(1<<k);
	k++;
  }
 return s;
}
int Sum_a(int a)
{
 int s=0,k,poz=0;
 bool ok=1;

  while(ok)
  {
	k=-1;
	ok=0;  
    while(s+c[poz+(1<<(k+1))]<=a && poz+(1<<(k+1))<=n)
     { 
		 k++; 
		 ok=1;
	  }
  if(k!=-1) 
     { 
	   s+=c[poz+(1<<k)]; 
	   poz+=(1<<k);
	 }
  }
  if(s-a==0 && a!=0) return poz;
     else return -1;
  
}
int main()
{
ifstream in("aib.in");
ofstream out("aib.out");
in>>n>>m;
int a,beg,end;
for(i=1;i<=n;i++)
  c[i]=0;

for(i=1;i<=n;i++)
{
 in>>x;
 update(i,x);
}

while(m)
{
in>>x;	
if(x==0) 
  { 
    in>>i>>a; 
    update(i,a); 
  }
 else 
	 if(x==1) 
	   { 
		 in>>beg>>end; 
	     out<<sum(end)-sum(beg-1)<<endl; 
	    }
        else 
			if(x==2) 
			 { 
			   in>>a; 
			   out<<Sum_a(a)<<endl;
			  }
m--;
}
return 0;
}