Cod sursa(job #1115969)

Utilizator crisbodnarCristian Bodnar crisbodnar Data 22 februarie 2014 11:37:26
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 1e5 + 100;

int N, M, LG, AIB[NMAX];

void Add(int val, int poz)
{
    while(poz <= N)
    {
        AIB[poz] += val;
        poz += poz&-poz;
    }
}

int Sum(int poz)
{
    int s = 0;
    while(poz)
    {
        s += AIB[poz];
        poz -= -poz&poz;
    }
    return s;
}

int CB(int val)
{
    int sol = 0;
    for(int lg = LG; lg; lg >>= 1)
        if(sol + lg <= N && AIB[sol + lg] < val)
            sol += lg; sol++;
    return sol;
}

int main()
{
    fin >> N >> M;
    for(LG = 1; LG <= N; LG <<= 1);
    for(int i = 1; i <=N; i++)
    {
        int x; fin >> x;
        Add(x, i);
    }

    while(M--)
    {
        int tip;
        fin >> tip;
        if(!tip)
        {
            int poz, val;
            fin >> poz >> val;
            Add(val, poz);
        }
        else if(tip == 1)
        {
            int a, b;
            fin >> a >> b;
            fout << Sum(b) - Sum(a - 1) << '\n';
        }
        else
        {
            int val;
            fin >> val;
            fout << CB(val) << '\n';
        }
    }
    return 0;
}