Cod sursa(job #3138001)

Utilizator SSKMFSS KMF SSKMF Data 16 iunie 2023 19:56:19
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <fstream>
using namespace std;

ifstream cin ("aib.in");
ofstream cout ("aib.out");

int lungime , suma[100001];

void Update (const int pozitie , const int valoare)
{
    for (int indice = pozitie ; indice <= lungime ; indice += (indice & -indice))
        suma[indice] += valoare;
}

int Suma (const int dreapta)
{
    int rezultat = 0;
    for (int indice = dreapta ; indice ; indice -= (indice & -indice))
        rezultat += suma[indice];

    return rezultat;
}

int main ()
{
    int operatii;
    cin >> lungime >> operatii;

    for (int ordine = 1 , numar ; ordine <= lungime ; ordine++)
    {
        cin >> numar;

        for (int indice = ordine ; indice <= lungime ; indice += (indice & -indice))
            suma[indice] += numar;
    }

    for (int operatie = 1 , tip , pozitie_stanga , valoare_dreapta ; operatie <= operatii ; operatie++)
    {
        cin >> tip >> pozitie_stanga;

        if (tip == 0 || tip == 1)
        {
            cin >> valoare_dreapta;

            if (tip == 0)
                Update(pozitie_stanga , valoare_dreapta);
            else
                cout << Suma(valoare_dreapta) - Suma(pozitie_stanga - 1) << '\n';
        }
        else
        {
            int stanga = 1 , dreapta = lungime , pozitie = -1;
            while (stanga <= dreapta)
            {
                const int mijloc = ((stanga + dreapta) >> 1) , suma = Suma(mijloc);
                if (suma == pozitie_stanga)
                    dreapta = mijloc - 1 , pozitie = mijloc;
                else
                    if (suma > pozitie_stanga)
                        dreapta = mijloc - 1;
                    else
                        stanga = mijloc + 1;
            }

            cout << pozitie << '\n';
        }
    }

    cout.close(); cin.close();
    return 0;
}