Cod sursa(job #202403)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 8 august 2008 02:33:15
Problema Arbori indexati binar Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 0.95 kb
#include <stdio.h>
#define N 100001
#define niv(x) (((x)^((x)-1))+1)/2
long mat[N];
long suma(long a)
{long S,j;
 for(S=0,j=a;j>0;j-=niv(j))
 {S+=mat[j];}
 return S;
}
int main ()
{FILE *fin=fopen("aib.in","r");
 FILE *fout=fopen("aib.out","w");
 long m,n,a,b,i,j;
 long st,dr,s;
 fscanf(fin,"%ld%ld",&n,&m);
 for (i=1;i<=n;i++)
 {fscanf(fin,"%ld",&mat[i]);}
 for (i=1;i<=n;i++)
 {for(a=niv(i),b=i-1;a/2;a=a>>1,b=b-niv(b))
  {mat[i]+=mat[b];}
 }
 for (i=1;i<=m;i++)
 {fscanf(fin,"%ld",&a);
  switch(a)
  {case 0:
   fscanf(fin,"%ld%ld",&a,&b);
   for(j=a;j<=n;j+=niv(j))
   {mat[j]+=b;}
   break;
   case 1:
   fscanf(fin,"%ld%ld",&a,&b);
   fprintf(fout,"%ld\n",suma(b)-suma(a-1));
   break;
   case 2:
   fscanf(fin,"%ld",&a);
   for(st=1,dr=n;suma((st+dr)/2)!=a||suma((st+dr)/2-1)==a;)
   {((s=suma((st+dr)/2))<a)?(st=(st+dr)/2+1):(dr=(st+dr)/2-1);
   }
   fprintf(fout,"%ld\n",(st+dr)/2);
  }
 }

fclose(fout);
 return 0;
}