Cod sursa(job #2583250)

Utilizator Florinos123Gaina Florin Florinos123 Data 17 martie 2020 22:35:46
Problema Arbori indexati binar Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>

using namespace std;

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

int n, m;
int poz;
int stanga, dreapta;
long long suma, val;
long long arbore[262150];

void update (int nod, int st, int dr)
{
    if (st == dr)
    {
        arbore[nod] += val;
        return;
    }

    int mij = (st + dr) / 2;

    if (poz <= mij)
        update(nod*2, st, mij);
    else
        update(nod*2+1, mij+1, dr);

    arbore[nod] = arbore[nod*2] + arbore[nod*2+1];
}

void querry (int nod, int st, int dr)
{
    if (st >= stanga && dr <= dreapta)
    {
        suma += arbore[nod];
        return;
    }

    int mij = (st + dr) / 2;

    if (stanga <= mij)
      querry(nod*2, st, mij);

    if (mij < dreapta)
      querry(nod*2+1, mij+1, dr);
}

int Search (long long val)
{
   int st = 1, dr = n, mij = 0;
    while (st <= dr)
    {
        mij = (st + dr) / 2;
        suma = 0, stanga = 1, dreapta = mij;
        querry(1, 1, n);

        if (suma == val)
           return mij;

        if (suma < val)
          st = mij + 1;
        else dr = mij - 1;
    }
   return -1;
}

int main()
{
   f >> n >> m;
   for (int i=1; i<=n; i++)
   {
       f >> val;
       poz = i;
       update(1, 1, n);
   }

   for (int i=1; i<=m; i++)
   {
       int type;
       f >> type;

       if (type == 0)
       {
          f >> poz >> val;
          update(1, 1, n);
       }
       else if (type == 1)
       {
          f >> stanga >> dreapta;
          suma = 0;
          querry(1, 1, n);
          g << suma << "\n";
       }
       else if (type == 2)
       {
           f >> val;
           g << Search(val) << "\n";
       }
   }
    return 0;
}