Cod sursa(job #1610630)

Utilizator BaweeLazar Vlad Bawee Data 23 februarie 2016 17:49:46
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <fstream>

using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

int n,m,unde,cat,st,dr,x,a, c[100001];

void modifica(int ind , int val) // adauga la c[ind] val
{
    int poz = 0;
    while(ind <= n)
    {
        c[ind] += val;
        while((ind & (1 << poz)) == 0) poz += 1;

        ind += 1 << poz;
        poz += 1;
    }
}

int suma(int ind) // suma de la 1 la ind
{
    int s = 0;
    int poz = 0;
    while(ind > 0)
    {
        s += c[ind];
        while((ind & (1 << poz)) == 0) poz += 1;

        ind -= (1 << poz);
        poz += 1;
    }

    return s;
}

int cauta(int sum) //cauti binar
{
    int poz = n + 1 , where , val;
    int limst = 0, limdr = n + 1;

    where = n;
    val = suma(where);

    if (val == sum) poz = n;

    while (where)
    {
          where = (limst + limdr) / 2;
          val = suma(where);

          if (val > sum)
          {
               if (limdr > where) limdr = where;
               where--;
          }
          else if (val == sum) poz = min(poz,where), limdr = where, where--;
          else
          {
              if(limst < where) limst = where;
              where++;
          }

          if (where <= limst) break;
          if (where >= limdr) break;
    }

    if (poz == n + 1) return -1;
    return poz;
}

int main()
{
    f >> n >> m;
    for(int i = 1; i <= n; ++i)
    {
        f >> x;
        modifica(i , x);
    }

    for(int i = 1; i <= m; ++i)
    {
        f >> x;
        if(x == 0)
        {
            f >> unde >> cat;
            modifica(unde , cat);
        }
        if(x == 1)
        {
            f >> st >> dr;
            g << suma(dr) - suma(st - 1) << "\n";
        }
        if(x == 2)
        {
            f >> a;
            g << cauta(a) << "\n";
        }
    }

    return 0;
}