Cod sursa(job #3176797)

Utilizator rapidu36Victor Manz rapidu36 Data 27 noiembrie 2023 19:37:54
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include <vector>

using namespace std;

int putere_2(int n)
{
    return (n & (-n));
}

void adauga(vector <int> &aib, int n, int p, int val)
{
    while (p <= n)
    {
        aib[p] += val;
        p += putere_2(p);
    }
}

long long suma(vector <int> &aib, int p)
{
    long long suma = 0;
    while (p != 0)
    {
        suma += aib[p];
        p -= putere_2(p);
    }
    return suma;
}

int poz_min(vector <int> &aib, int n, long long s)
{
    int pas = 1 << 16, p = 0;
    long long copie_s = s;
    while (pas != 0)
    {
        if (p + pas <= n && aib[p + pas] < s)
        {
            s -= aib[p + pas];
            p += pas;
        }
        pas /= 2;
    }
    ///p = cea mai mare pozitie i cu propr. ca v[1]+v[2]+...+v[i] < copie_s
    if (p < n && suma(aib, p + 1) == copie_s)
    {
        return p + 1;
    }
    return -1;
}

int main()
{
    ifstream in("aib.in");
    ofstream out("aib.out");
    int n, m;
    in >> n >> m;
    vector <int> aib(n + 1, 0);
    for (int  i = 1; i <= n; i++)
    {
        int val;
        in >> val;
        adauga(aib, n, i, val);
    }
    for (int i = 0; i < m; i++)
    {
        int tip;
        in >> tip;
        if (tip == 0)
        {
            int poz, val;
            in >> poz >> val;
            adauga(aib, n, poz, val);
        }
        else if (tip == 1)
        {
            int a, b;
            in >> a >> b;
            out << suma(aib, b) - suma(aib, a - 1) << "\n";
        }
        else
        {
            long long s;
            in >> s;
            out << poz_min(aib, n, s) << "\n";
        }
    }
    in.close();
    out.close();
    return 0;
}