Cod sursa(job #874670)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 9 februarie 2013 10:05:36
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 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 = 0, step;

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

    return i;
}

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