Cod sursa(job #779618)

Utilizator SteveStefan Eniceicu Steve Data 18 august 2012 12:45:58
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>

using namespace std;

#define point(i) ((i & (i - 1)) ^ i)

int N, M, A, B;
int aib[100005];

void Update (int i, int A) {
    while (i <= N)
    {
        aib[i] += A;
        i += point (i);
    }
}

int Query (int A, int B) {
    int cnt = 0;
    while (B >= 1)
    {
        cnt += aib[B];
        B -= point (B);
    }
    A--;
    while (A >= 1)
    {
        cnt -= aib[A];
        A -= point (A);
    }
    return cnt;
}

int Search (int val) {
    int i = 0, step = 1 << 17;
    for (; step; step >>= 1)
    {
        if (i + step <= N && aib[i + step] <= val)
        {
            val -= aib[i + step];
            i += step;
        }
    }
    if (!val) return i;
    return -1;
}

int main () {
    ifstream fin ("aib.in");
    ofstream fout ("aib.out");
    fin >> N >> M;
    for (int i = 1; i <= N; i++)
    {
        fin >> A;
        Update (i, A);
    }
    int lol;
    for (int i = 0; i < M; i++)
    {
        fin >> lol;
        if (!lol)
        {
            fin >> A >> B;
            Update (A, B);
        }
        else if (lol == 1)
        {
            fin >> A >> B;
            fout << Query (A, B) << "\n";
        }
        else
        {
            fin >> A;
            fout << Search (A) << "\n";
        }
    }
    fout.close ();
    return 0;
}