Cod sursa(job #2909171)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 9 iunie 2022 18:35:28
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>

using namespace std;

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

#define zeros(x)((x ^ (x - 1)) & x)

const int max_size = 1e5 + 1;

int a[max_size], aib[max_size], n;

void update (int poz, int val)
{
    for (int i = poz; i <= n; i += zeros(i))
    {
        aib[i] += val;
    }
}

int querry (int poz)
{
    int rez = 0;
    for (int i = poz; i > 0; i -= zeros(i))
    {
        rez += aib[i];
    }
    return rez;
}

int cb (int val)
{
    int rez = 0, pas = (1 << 16);
    while (pas != 0)
    {
        if (rez + pas <= n && aib[rez + pas] < val)
        {
            val -= aib[rez + pas];
            rez += pas;
        }
        pas /= 2;
    }
    if (rez == n || querry(rez + 1) - querry(rez) != val)
    {
        return -1;
    }
    return rez;
}

int main ()
{
    int t;
    in >> n >> t;
    for (int i = 1; i <= n; i++)
    {
        in >> a[i];
        update(i, a[i]);
    }
    while (t--)
    {
        int op;
        in >> op;
        if (op == 2)
        {
            int x;
            in >> x;
            out << cb(x) + 1 << '\n';
        }
        else
        {
            int x, y;
            in >> x >> y;
            if (op == 0)
            {
                update(x, y);
            }
            else
            {
                out << querry(y) - querry(x - 1) << '\n';
            }
        }
    }
    in.close();
    out.close();
    return 0;
}