Cod sursa(job #1609335)

Utilizator justsomedudePalade Thomas-Emanuel justsomedude Data 22 februarie 2016 18:58:20
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<iostream>
#include<fstream>

using namespace std;

ifstream fin   ("aib.in");
ofstream fout ("aib.out");

int c[100005], M, n;

void Update(int i, int x)
{
    while (i <= n)
    {
        c[i] += x;
        i = i + (i & (-i));
    }
}


int Query(int i)
{
    int s;
    s = 0;
    while (i > 0)
    {
        s += c[i];
        i = i - (i & (-i));
}
return s;
}


int Pozitie(int a)
{
    int st, dr, sol, mij, suma;
    st = 1; dr = n;
    sol = -1;
    while (st <= dr)
    {
        mij = (st + dr ) / 2;
        suma = Query(mij);
        if (suma == a) { sol = mij; dr = mij - 1; }
        else if (suma > a) dr = mij - 1;
        else st = mij + 1;
}
return sol;
}

void Citire()
{
   int x;
   fin >> n >> M;
   for (int i = 1; i <= n; ++i)
 {
    fin >> x;
    Update(i, x);
 }
}

void Rezolva()
{
   int cod, x, y, poz;
   for (int i = 1; i<=M; i++)
   {
      fin >> cod;
      if (cod == 0)
        {
           fin >> poz >> x;
           Update(poz, x);
        }
      else
        if (cod == 1)
        {
           fin >> x >> y;
           fout << Query(y) - Query(x-1) << "\n";
        }
      else
        {
           fin >> x;
           fout << Pozitie(x)  << "\n";
        }
   }
}


int main ()
{
  Citire();
  Rezolva();
  fin.close();
  fout.close();
  return 0;
}