Cod sursa(job #2172952)

Utilizator aurelionutAurel Popa aurelionut Data 15 martie 2018 19:17:11
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>

using namespace std;

const int DIM = 100010;
int n, q;
int v[DIM], aib[DIM];

inline int lsb(const int& x)
{
    return (x & (-x));
}

void Update(int pos, int val)
{
    for (int i = pos;i <= n;i += lsb(i))
        aib[i] += val;
}

int Query(int pos)
{
    int ret = 0;
    for (int i = pos;i >= 1;i -= lsb(i))
        ret += aib[i];
    return ret;
}

int BinarySearch(int val)
{
    int left = 1, right = n, mid, p = -1, aux;
    while (left <= right)
    {
        mid = (left + right) / 2;
        aux = Query(mid);
        if (aux == val)
        {
            p = mid;
            right = mid - 1;
        }
        else if (aux < val)
            left = mid + 1;
        else
            right = mid - 1;
    }
    return p;
}

int main()
{
    ifstream fin("aib.in");
    ofstream fout("aib.out");
    fin >> n >> q;
    int op, x, y;
    for (int i = 1;i <= n;++i)
    {
        fin >> x;
        Update(i, x);
    }
    for (int i = 1;i <= q;++i)
    {
        fin >> op;
        if (op == 0)
        {
            fin >> x >> y;
            Update(x, y);
        }
        else if (op == 1)
        {
            fin >> x >> y;
            fout << Query(y) - Query(x - 1) << "\n";
        }
        else
        {
            fin >> x;
            fout << BinarySearch(x) << "\n";
        }
    }
    fin.close();
    fout.close();
    return 0;
}