Cod sursa(job #255953)

Utilizator drag0shSandulescu Dragos drag0sh Data 10 februarie 2009 21:39:53
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <stdio.h>
#include <string.h>

#define in "aib.in"
#define out "aib.out"
#define dim 100001

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

FILE *f=fopen(in,"r"),*g=fopen(out,"w");

int n,m,t;
int arb[dim];
int c,s;

void actualizare(int,int);
void interogare(int);
int cautare(int);

int main(){
  memset(arb,0,sizeof(arb));
  int k,x,y,i;
  fscanf(f,"%d%d",&n,&m);
  for(i=1;i<=n;i++){
    fscanf(f,"%d",&t);
    actulizare(1,t);
    }
  for(;m;m--){
    fscanf(f,"%d",&k);
    if(k<2){
      fscanf(f,"%d%d",&x,&y);
      if(!k)actualizare(x,y);
      else fprintr(g,"%d\n",interogare(y)-interogare(x-1));
      
    }
  }
}

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

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

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