Cod sursa(job #2875809)

Utilizator AndreeeeiAndrei-Ioan Andreeeei Data 22 martie 2022 13:09:30
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>

using namespace std;
ifstream in ("aib.in");
ofstream out ("aib.out");

int aib[100005];

void update(int p, int x, int n)
{
    for(int i = p; i <= n; i += (i&(-i)))
        aib[i] += x;
}

int sum (int p)
{
    int ans = 0;

    for(int i = p; i >= 1; i -= (i&(-i)))
        ans += aib[i];

    return ans;
}

int binar (int x, int n)
{
    int a = 1, b = n, ans = 1;

    while(a <= b)
    {
        int k = (a + b) / 2;
        if(sum(k) <= x)
        {
            a  = k + 1;
            ans = k;
        }
        if(sum(k) > x)
            b = k - 1;
    }
    if(sum(ans) == x)
        return ans;
    else
    return -1;
}

int main()
{
    int n, m, x, c, a, b;
    in >> n >> m;

    for(int i = 1; i <= n; i ++)
    {
        in >> x;
        update(i, x, n);
    }

    for(int i = 1; i <= m; i++)
    {
        in >> c;
        if(c == 0)
        {
            in >> a >> b;
            update(a, b, n);
        }
        else if(c == 1)
        {
            in >> a >> b;
            out << sum(b) - sum(a - 1) << '\n';
        }
        else
        {
            in >> x;
            out << binar(x, n) << '\n';
        }
    }
    return 0;
}