Cod sursa(job #2040782)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 16 octombrie 2017 15:34:52
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#define DIM 100002

using namespace std;

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

int n, m, x, tip, a, b;
unsigned int v[DIM];

void update(int a, int b)
{
    for(; a <= n; a += (a & -a))
        v[a] += b;
}

unsigned int query(int a)
{
    unsigned int s = 0;
    for(; a; a -= (a & -a))
        s += v[a];
    return s;
}

void solve0()
{
    f>>a>>b;
    update(a, b);
}

void solve1()
{
    f>>a>>b;
    -- a;
    unsigned int A = 0;
    if(a)
        A = query(a);
    unsigned int B = query(b);
    g<<B - A<<'\n';
}

void solve2()
{
    f>>a;
    int st = 1;
    int dr = n;
    while(st <= dr)
    {
        int mid = (st + dr) / 2;
        int val = query(mid);
        if(val >= a)
            dr = mid - 1;
        else
            st = mid + 1;
    }
    if(query(st) == a)
        g<<st<<'\n';
    else
        g<<"-1\n";
}

int main()
{
    f>>n>>m;
    for(int i = 1; i <= n; ++ i)
    {
        f>>x;
        update(i, x);
    }
    for(int i = 1; i <= m; ++ i)
    {
        f>>tip;
        switch (tip)
        {
            case 0: solve0(); break;
            case 1: solve1(); break;
            case 2: solve2(); break;
        }

    }
    return 0;
}