Cod sursa(job #2856591)

Utilizator Mihai7218Bratu Mihai-Alexandru Mihai7218 Data 24 februarie 2022 09:16:48
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int a, i, b, n, op, m, j, x;
vector <int> aib;
void update (int poz, int val)
{
    for (int i = poz; i <= n; i += i & (-i))
        aib[i]+=val;
}
int query (int a)
{
    int suma = 0;
    for (int i = a; i > 0; i -= i&(-i))
        suma += aib[i];
    return suma;
}
int finder (int a)
{
    int poz = 1, cp = 0;
    while (poz < n)
        poz *= 2;
    for (; poz > 0; poz/=2)
    {
        if (cp+poz <= n && a >= aib[cp+poz])
        {
            cp += poz; a -= aib[cp];
            if (a == 0) return cp;
        }
    }
    return -1;
}
int main()
{
    fin >> n >> m; aib.resize(n+1);
    for (i = 1; i <= n; i++)
    {
        fin >> x;
        update (i, x);
    }
    for (i = 1; i <= m; i++)
    {
        fin >> op;
        if (op == 0)
        {
            fin >> a >> b;
            update (a, b);
        }
        else if (op == 1)
        {
            fin >> a >> b;
            fout << query (b) - query (a-1) << "\n";
        }
        else if (op == 2)
        {
            fin >> a;
            fout << finder(a) << "\n";
        }
    }
    return 0;
}