Cod sursa(job #2242026)

Utilizator AnDrEeA1915Monea Andreea AnDrEeA1915 Data 17 septembrie 2018 16:39:56
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
using namespace std;

int n, m, aib[100001], a, b, tip;

void update(int pos, int val)
{
    for(int i = pos; i <= n; i += i & -i)
        aib[i] += val;

}

int querry(int pos)
{
    int sum = 0;
    for(int i = pos; i; i -= i & -i)
        sum += aib[i];
    return sum;
}

int searc(int sum)
{
    int l = 1, r = n, pos = -1;

    while(l <= r)
    {
        int mij = (l + r) / 2;
        int x = querry(mij);

        if(sum < x)
            r = mij - 1;
        else if(sum > x)
            l = mij + 1;
        else{
            pos = mij;
            break;
        }
    }
    return pos;
}

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);
    }
    for (int i = 0; i < m ; ++i)
    {
        fin >> tip;
        switch(tip)
        {
            case 0: fin >> a >> b;
                    update(a, b);
                    break;
            case 1: fin >> a >> b;
                    fout << querry(b) - querry(a - 1) << endl;
                    break;
            case 2: fin >> a;
                    fout << searc(a) << endl;;
        }
    }
    return 0;
}