Cod sursa(job #233306)

Utilizator FlorianFlorian Marcu Florian Data 17 decembrie 2008 14:10:29
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<stdio.h>
#define bit(x) ( (x) & ( (x) - 1) ^ (x) )
FILE*f=fopen("aib.in","r");
FILE*g=fopen("aib.out","w");
int n,aib[100003];
int m;
void update(int x, int v) //a[x]+=v
 {
 for(;x<=n;x+=bit(x)) aib[x]+=v;
 }
int query(int x) // returnez suma de la 1 la x
 {
 int s=0;
 for(;x;x-=bit(x)) s+=aib[x];
 return s;
 }
int min(int a)
 {
 //suma valorilor primilor k termeni = a
 int q,i,j,m;
 i=1; j=n;
 while(i<=j)
  {
  m=(i+j)/2;
  q=query(m);
  if(q == a)
    {
    if(query(m-1) == a) j=m-1;
    return m;
    }
  else if(q < a) i=m+1;
  else j=m-1;
  }
 return -1;
 }
int main()
 {
 fscanf(f,"%d %d",&n, &m);
 int a,b,x,i,rez;
 for(i=1;i<=n;++i)
  {
  fscanf(f,"%d",&x);
  update(i,x);
  }
 while(m--)
  {
  fscanf(f,"%d",&x);
  switch(x)
   {
   case 0:
    {
    fscanf(f,"%d %d",&a,&b);
    update(a,b);
    break;
    }
   case 1:
    {
    fscanf(f,"%d%d",&a,&b);
    fprintf(g,"%d\n",query(b) - query(a-1));
    break;
    }
   case 2:
    {
     fscanf(f,"%d",&a);
     rez=min(a);
     fprintf(g,"%d\n",rez);
     break;
    }
   }
  }
 return 0;
 }