Cod sursa(job #3196637)

Utilizator Ruxandra009Ruxandra Vasilescu Ruxandra009 Data 24 ianuarie 2024 13:59:34
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 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 + sum(poz + (1<<i)) <= x)
        {
            poz += (1<<i);
            s += sum(poz);
        }
    }

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

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;
}