Cod sursa(job #3261783)

Utilizator mirceamaierean41Mircea Maierean mirceamaierean41 Data 7 decembrie 2024 11:51:42
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>

using namespace std;

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

const int NMAX = 1e5 + 1;
int n, m, a;
int aib[NMAX];

int ub(int x)
{
    return x & (-x);
}

void add(int x, int val)
{
    for (int i = x; i <= n; i += ub(i))
        aib[i] += val;
}

int sum(int x)
{
    int sum = 0;
    for (int i = x; i; i -= ub(i))
        sum += aib[i];
    return sum;
}

int binary_search(int s)
{
    int st = 1, dr = n;
    while (st <= dr)
    {
        int mij = (st + dr) / 2;
        int crt_sum = sum(mij);
        if (crt_sum == s)
            return mij;
        if (crt_sum < s)
            st = mij + 1;
        else
            dr = mij - 1;
    }
    return -1;
}

int main()
{
    fin >> n >> m;
    for (int i = 1; i <= n; ++i)
    {
        fin >> a;
        add(i, a);
    }

    int q, x;

    while (m--)
    {
        fin >> q;
        if (q == 0)
        {
            fin >> x >> a;
            add(x, a);
        }
        else if (q == 1)
        {
            fin >> x >> a;
            fout << sum(a) - sum(x - 1) << '\n';
        }
        else
        {
            fin >> a;
            fout << binary_search(a) << '\n';
        }
    }

    return 0;
}