Cod sursa(job #2762962)

Utilizator vlad2009Vlad Tutunaru vlad2009 Data 10 iulie 2021 15:11:14
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>

using namespace std;

const int Nmax = 100000;
int aib[Nmax + 1];

void upd(int k, int x, int n)
{
    while (k <= n)
    {
        aib[k] += x;
        k += (k & -k);
    }
}

int qry(int k)
{
    int ans = 0;
    while (k >= 1)
    {
        ans += aib[k];
        k -= (k & -k);
    }
    return ans;
}

int cb(int a, int n)
{
    int st = 1, dr = n, sol = Nmax + 1;
    while (st <= dr)
    {
        int mijl = (st + dr) / 2;
        int s = qry(mijl);
        if (s == a)
        {
            sol = mijl;
        }
        if (s >= a)
        {
            dr = mijl - 1;
        }
        else
        {
            st = mijl + 1;
        }
    }
    return sol;
}

int main()
{
    ifstream fin("aib.in");
    ofstream fout("aib.out");
    int n, t;
    fin >> n >> t;
    for (int i = 1; i <= n; i++)
    {
        int nr;
        fin >> nr;
        upd(i, nr, n);
    }
    while (t--)
    {
        int t, a, b;
        fin >> t >> a;
        if (t == 0)
        {
            fin >> b;
            upd(a, b, n);
        }
        else if (t == 1)
        {
            fin >> b;
            fout << qry(b) - qry(a - 1) << "\n";
        }
        else
        {
            int ans = cb(a, n);
            if (ans == Nmax + 1)
            {
                ans = -1;
            }
            fout << ans << "\n";
        }
    }
    return 0;
}