Cod sursa(job #1999463)

Utilizator zanugMatyas Gergely zanug Data 11 iulie 2017 10:49:15
Problema Arbori indexati binar Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int N = 1e5+10;

const int INF = 0;

int v[N];
int x[N*10];
int n, m;
int lef, rig;

int left(int i)
{
    return 2*i + 1;
}
int right(int i)
{
    return 2*i + 2;
}

int get(int node, int l, int r, int ll, int rr)
{
    if(l >= ll && r <= rr)
    {
        return x[node];
    }

    if(r < ll || l > rr)
    {
        return INF;
    }

    int mid = (l + r) / 2;
    return get(left(node), l, mid, ll, rr) + get(right(node), mid+1, r, ll, rr);
}

int update(int node, int l, int r, int poz, int val)
{
    if(l == r && r == poz)
    {
        x[node] += val;
        return x[node];
    }
    if(r < poz || l > poz)
    {
        return x[node];
    }

    int mid = (l + r) / 2;
    int leftu = update(left(node), l, mid, poz, val);
    int rightu = update(right(node), mid+1, r, poz, val);
    x[node] = leftu + rightu;
    return x[node];
}

int binget(int node, int l, int r, int k)
{
    if(l > r)
        return -2;

    int mid = (l + r) / 2;
    int midval = get(0, 0, n-1, 0, mid);

    if(midval == k)
        return mid;
    else if(k < midval)
        return binget(left(node) , l, mid-1, k);
    else
        return binget(right(node), mid+1, r, k);
}

void build(int node, int l, int r)
{
    if(l == r)
    {
        x[node] = v[l];
        return;
    }

    int mid = (l + r) / 2;
    build(left(node), l, mid);
    build(right(node), mid+1, r);
    x[node] = x[left(node)] + x[right(node)];
}

int main()
{
    fin >> n >> m;
    for(int i = 0; i < n; ++i)
    {
        fin >> v[i];
    }

    build(0, 0, n-1);

    for(int i = 0; i < m; ++i)
    {
        int typ;
        fin >> typ;

        if(typ == 0)
        {
            int poz, val;
            fin >> poz >> val;
            update(0, 0, n-1, poz-1, val);
        }
        else if(typ == 1)
        {
            int lef, rig;
            fin >> lef >> rig;
            fout << get(0, 0, n-1, lef-1, rig-1) << "\n";
        }
        else if(typ == 2)
        {
            int k;
            fin >> k;
            fout << binget(0, 0, n-1, k) + 1 << "\n";
        }
    }

    return 0;
}