Cod sursa(job #244502)

Utilizator Sorin_IonutBYSorynyos Sorin_Ionut Data 15 ianuarie 2009 10:55:42
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <stdio.h>

using namespace std;

#define IN "aib.in"
#define OUT "aib.out"
#define DIM 100001

FILE *fin=fopen(IN,"r");
FILE *fout=fopen(OUT,"w");

int n,m,t;
int arb[DIM]={0};
int c,s;

inline int minim(int,int);
void update(int,int);
int query(int);
int search(int);

int main()
{
 int k,x,y;
 int i;
    
 fscanf(fin,"%d%d",&n,&m);
 for(i=1;i<=n;i++)
 {
  fscanf(fin,"%d",&t);
  update(i,t);
 }
    
 for(;m;m--)
 {
  fscanf(fin,"%d",&k);
  
  if(k<2)
  {
   fscanf(fin,"%d%d",&x,&y);
   
   if(!k)
    update(x,y);
   else
    fprintf(fout,"%d\n",(query(y)-query(x-1)));
  }
  else
  {
   fscanf(fin,"%d",&x);
   fprintf(fout,"%d\n",(search(x)));
  }
 }
 fclose(fin);
 fclose(fout);
 return 0;
}

int search(int val)
{
 int i,pas;
    
 for(pas=1;pas<n;pas<<=1); 
    
 for(i=0;pas;pas>>=1)
 {
  if(i+pas<=n)
  {
   if(val>=arb[i+pas]) 
   {
    i=i+pas;
    val=val-arb[i];
    
    if(!val)
     return i;
   }
  }
 }
 return -1;
}

void update(int poz,int val)
{
 c=0;
 
 while(poz<=n)
 {
  arb[poz]=arb[poz]+val;
  
  while(!(poz & (1<<c)))
   c++;
   
  poz=poz+(1<<c);
  c=c+1;
 }
}

int query(int poz)
{
 c=0,s=0;
 
 while(poz>0)
 {
  s=s+arb[poz];
  
  while(!(poz & (1<<c)))
   c++;
   
  poz=poz-(1<<c);
  c=c+1;
 }
    
 return s;
}

inline int minim(int a, int b)
{
 if(a<b) 
  return a;
 return b;
}