Cod sursa(job #2088729)

Utilizator petru.ciocirlanPetru Ciocirlan petru.ciocirlan Data 15 decembrie 2017 19:19:33
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>
#define in "aib.in"
#define out "aib.out"
#define MN 100005
using namespace std;
int N, M, Arb[4*MN];

void update(int poz, int val);
int query(int poz);
int aibsrc(int val);

int main()
{
    assert(freopen(in, "r", stdin));
    assert(freopen(out,"w", stdout));
    assert(scanf("%d%d", &N, &M));
    for(int x, i = 1; i <= N; ++i)
    {
        assert(scanf("%d", &x));
        update(i, x);
    }
    for(int tip, a, b; M; --M)
    {
        assert(scanf("%d", &tip));
        if(tip < 2)
        {
            assert(scanf("%d%d", &a, &b));
            if(!tip) update(a, b);
            else assert(printf("%d\n", query(b)-query(a-1)));
        }
        else
        {
            assert(scanf("%d", &a));
            assert(printf("%d\n", aibsrc(a)));
        }
    }
    return 0;
}

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

int query(int poz)
{
    int sum = 0;
    while(poz > 0)
    {
        sum += Arb[poz];
        poz -= (poz & -poz);
    }
    return sum;
}

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