Cod sursa(job #181936)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 20 aprilie 2008 02:09:16
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 kb
//arbori indexati binar
#include<stdio.h>
unsigned int a[1000];
unsigned int c[1000];
unsigned int n,p1,p2,p3,i,m,tsk3;
unsigned int Sum(unsigned int aux)
{
     unsigned int sum1=0;
     unsigned int k;
     while (aux!=0)
      {
       sum1+=c[aux];
       k=0;
       while (((1<<k)&aux)==0) k++;
       aux-=(1<<k);
      }
   return sum1;
}
unsigned int Query2(unsigned int val)
{
   unsigned int mij,aux,k;
   unsigned int st=1;
   unsigned int dr=n;
   while (st<=dr)
    {
     mij=(st+dr)/2;
     aux=Sum(mij);
     if (aux<val) st=mij+1;
           else
             if (aux>val) dr=mij-1;
              else
               return mij;
    }
   return 0;
}
unsigned int Query1(unsigned int poz1,unsigned int poz2)
{
   unsigned int k;
   unsigned int aux=poz1-1;
   unsigned int aux2=poz2;
   unsigned int sum1=0,sum2=0;

   while (aux!=0)
      {
       sum1+=c[aux];
       k=0;
       while (((1<<k)&aux)==0) k++;
       aux-=(1<<k);
      }
    while (aux2!=0)
      {
       sum2+=c[aux2];
       k=0;
       while (((1<<k)&aux2)==0) k++;
       aux2-=(1<<k);
      }
   return sum2-sum1;
}
unsigned int Update(unsigned int poz, unsigned int val)
{
   unsigned int k;
   while (poz<=n)
   {
   c[poz]+=val;
   k=0;
   while (((1<<k)&poz)==0) k++;
   poz+=(1<<k);
   }
   return 0;
}
int main()
{
   freopen("aib.in","r",stdin);
   freopen("aib.out","w",stdout);
   scanf("%d %d",&n,&m);
   for(i=1;i<=n;i++)
   {
    scanf("%d",&a[i]);
    Update(i,a[i]);
   }
   for(i=1;i<=m;i++)
       {
         scanf("%d",&p1);
         if (p1==0)
            {
            scanf("%d %d",&p2,&p3);
            Update(p2,p3);
            }
             else
              if (p1==1)
                 {
                 scanf("%d %d",&p2,&p3);
                 printf("%d\n",Query1(p2,p3));
                 }
               else
                if (p1==2)
                  {
                   scanf("%d",&p2);
                   tsk3=Query2(p2);
                   if (tsk3!=0) printf("%d\n",tsk3);
                          else  printf("-1\n");
                  }
       }
   return 0;
}