Cod sursa(job #174335)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 8 aprilie 2008 19:46:21
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <string.h>
#include <stdio.h>
#define N 100001
#define p(x) ((x^(x-1))/2+1)
unsigned long v[N];
long bin(long min,long max,long n)
{long i,s,mid=(min+max)/2;
 for (s=0,i=mid;i>=1;i-=p(i))
 {s+=v[i];}
 if(s==n){return mid;}
 else if(s>n){return bin(1,mid-1,n);}
 else return bin(mid+1,max,n);
}

int main ()
{FILE *fin,*fout;
 unsigned long a,b,n,m,i,j,k,s;int f;
 memset(v,0,sizeof(v));
 fin=fopen("aib.in","r");
 fout=fopen("aib.out","w");
 fscanf(fin,"%ld%ld",&n,&m);
 for (i=1;i<=n;i++)
 {fscanf(fin,"%ld",&v[i]);
 }
 for (i=1;i<=n;i++)
 {
  for (k=p(i)-1,j=i-1;k>0;j-=p(j),k/=2)
  {v[i]+=v[j];}
 }
 for (i=1;i<=m;i++)
 {fscanf(fin,"%d",&f);
  switch(f)
  {case 0:fscanf(fin,"%ld%ld",&a,&b);
   for (j=a;j<=n;j+=p(j))
   {v[j]+=b;}
   break;
   case 1:
   fscanf(fin,"%ld%ld",&a,&b);
   for (s=0,j=b;j>=1;j-=p(j))
   {s+=v[j];}

   for (j=a-1;j>=1;j-=p(j))
   {s-=v[j];}
   fprintf(fout,"%ld\n",s);
   break;
   case 2:
   fscanf(fin,"%ld",&a);
   fprintf(fout,"%ld\n",bin(1,n,a));
   break;
  }
 }

 fclose(fout);
 return 0;
}