Cod sursa(job #874672)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 9 februarie 2013 10:07:39
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int N;
int AIB[1 << 17];

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

inline void update (int poz, int val)
{
    for ( ; poz <= N; poz += lsb (poz))
        AIB[poz] += val;
}

inline int query (int poz)
{
    int Ans = 0;

    for ( ; poz; poz -= lsb (poz))
        Ans += AIB[poz];

    return Ans;
}

inline int BS (int val)
{
    int i = N, step;

    for (step = 1; step <= N; step <<= 1);
    for ( ; step; step >>= 1)
        if (i - step >= 1 && query (i - step) >= val)
            i -= step;

    if (query (i) == val)
        return i;
    else
        return -1;
}

int main()
{
    int Q, i, tip, x, y;

    in >> N >> Q;

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

    while (Q --){
        in >> tip;

        if (!tip)
            in >> x >> y, update (x, y);

        if (tip == 1)
            in >> x >> y, out << query (y) - query (x - 1) << "\n";

        if (tip == 2)
            in >> x, out << BS (x) << "\n";
    }

    return 0;
}