Cod sursa(job #279618)

Utilizator otilia_sOtilia Stretcu otilia_s Data 12 martie 2009 21:37:27
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <stdio.h>
#include <string.h>
int v[10002],n,m;

FILE *fin=fopen("aib.in","r");
FILE *fout=fopen("aib.out","w");

void aduna()
{ int a,b;
 fscanf(fin,"%d %d", &a,&b);
 while (a<=n)
  {
   v[a]+=b;
   a+=(a^(a-1)) &a;
  }
}

void suma_int()
{ int a,b,j,s1,s2;
 fscanf(fin,"%d %d", &a,&b);
 s1=0; j=b;
 while (j)
  {
   s1+=v[j];
   j-=(j^(j-1))&j;
  }
 s2=0; j=a-1; 
 while (j)
  {
   s2+=v[j];
   j-=(j^(j-1))&j;
  }
 fprintf(fout,"%d\n",s1-s2);
}

void min_k()
{ int a,gasit,j,st,dr,x,s1;
 fscanf(fin,"%d", &a);
 st=1;dr=n; gasit=0; x=0;
 do
  {
   x=(dr+st)/2;
   s1=0; j=x;
   while (j)
    {
     s1+=v[j];
     j-=(j^(j-1))&j;;
    }
   if (s1==a) {gasit=x;dr=x-1;}
      else
       if (s1>a) {dr=x-1;}
	  else {st=x+1;}
  }
 while (dr>=st);
 if (!gasit) gasit=-1;
 fprintf(fout,"%d\n",gasit);
}

int main()
{
 memset(v,0,sizeof(v));
 fscanf(fin,"%d %d",&n,&m);
 int i,j,x,poz;
 for (i=1;i<=n;i++)
  {
   fscanf(fin,"%d",&x);
   j=i; 
   while (j<=n)
    {
     v[j]+=x;
     j+=(j^(j-1))&j;     
    }
  }

 int operatie,op;
 for (operatie=0;operatie<m;operatie++)
  {
   fscanf(fin,"%d",&op);
   switch (op)
    {
     case 0:{ aduna(); break;}
     case 1:{ suma_int(); break;}
     default: { min_k();}
    }
  }
 fclose(fin);
 fclose(fout);
 return 0;
}