Cod sursa(job #3196638)

Utilizator Ruxandra009Ruxandra Vasilescu Ruxandra009 Data 24 ianuarie 2024 14:04:01
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

const int nmax = 100500;

int n, aib[nmax], sol, a[nmax], m;

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

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

int sum(int p)
{
    int rez = 0;
    for(int i = p; i >= 1; i -= ub(i))
        rez += aib[i];

    return rez;
}

int found(int x)
{
    int poz = 0, s = 0;
    for(int i = 17; i >= 0; i --)
    {
        if(poz + (1<<i) <= n && s + aib[poz + (1<<i)] < x)
        {
            poz += (1<<i);
            s += aib[poz];
        }
    }

    if(1 + poz > n || sum(poz + 1) != x)
        return -1;
    else
        return poz + 1;
}

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

    for(int i = 1; i <= m; i ++)
    {
        int tip;
        f >> tip;
        if(tip == 0)
        {
            int a, x;
            f >> a >> x;
            add(a, x);
        }

        else if(tip == 1)
        {
            int a, b;
            f >> a >> b;
            g << sum(b) - sum(a - 1) << '\n';
        }

        else
        {
            int x;
            f >> x;
            g << found(x) << '\n';
        }
    }

    return 0;
}