Cod sursa(job #1449389)

Utilizator DrumeaVDrumea Vasile DrumeaV Data 9 iunie 2015 14:27:49
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <stdio.h>
#define Dim 100010

int N,M,BIT[Dim],X,Y,Op;

void Update(int Idx,int Val)
{
    while (Idx <= N)
    {
        BIT[Idx] += Val;
        Idx += (Idx & (-Idx));
    }
}

int Sum(int Idx)
{
    int R = 0;
    while (Idx)
    {
        R += BIT[Idx];
        Idx -= (Idx & (-Idx));
    }
    return R;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);

      scanf("%d %d",&N,&M);

      for (int i = 1;i <= N;i++)
      {
          scanf("%d",&Y);
          Update(i,Y);
      }

      for (int i = 1;i <= M;i++)
      {
          scanf("%d",&Op);

          switch (Op)
          {
              case 0:
                       scanf("%d %d",&X,&Y);
                       Update(X,Y);
                       break;
              case 1:
                       scanf("%d %d",&X,&Y);
                       printf("%d\n",Sum(Y)-Sum(X-1));
                       break;
              case 2:
                       scanf("%d",&X);
                       int L = 1,R = N,Mid,S;

                       while (L <= R)
                       {
                           Mid = (L + R) / 2;
                           S = Sum(Mid);
                           if (X == S) break;
                          else
                            if (S > X) R = Mid - 1;
                                  else L = Mid + 1;
                       }
                       if (X == S) printf("%d\n",Mid);
                              else printf("-1\n");
          }
      }
    return 0;
}