Cod sursa(job #2550292)

Utilizator Botzki17Botocan Cristian-Alexandru Botzki17 Data 18 februarie 2020 18:07:22
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>

using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int NMAX = 100000;
int aib[NMAX+5], n;
///Complexitatea fiecarui update este de O(log n)
void update(int poz, int val)
{
    while(poz <=n)
    {
      aib[poz] = aib[poz] + val;
      poz = poz + (poz & (-poz));
    }
}

///Complexitatea fiecarui query este de O(log n). Aceasta functie imi va returna suma elemetelor de la 1 la poz.Astfel, query(a, b) = query(b)- query(a-1);
int query(int poz)
{
    int s = 0;
    while(poz > 0)
    {
        s = s + aib[poz];
        poz = poz - (poz & (-poz));
    }
    return s;
}

///Pentru cerinta 2, avand in vedere ca numerele sunt toate pozitive si nu pot deveni negative in urma update-urilor, putem sa ne folosim de cautarea binara
///deoarece sumele vor fi astfel in ordine crescatoare.
int cautare_binara(int val, int st, int dr)
{
    int mid, suma;
    while(st<=dr)
    {
        mid = (st + dr) >>1;
        suma = query(mid);
        if(suma == val)
           return mid;
        if(suma < val)
           st = mid + 1;
        else
            dr = mid -1;
    }
    return -1;
}
int main()
{
    int m, x, i, a, b, t;
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        fin>>x;
        update(i, x);
    }
    for(i=1;i<=m;i++)
    {
        fin>>t;
        if(t == 0)
        {
            fin>>a>>b;
            update(a, b);
            continue;
        }
        if(t == 1)
        {
            fin>>a>>b;
            fout<<query(b) - query(a-1)<<"\n";
            continue;
        }
        if(t == 2)
        {
            fin>>a;
            fout<<cautare_binara(a, 1, n)<<"\n";
        }
    }
    return 0;
}