Mai intai trebuie sa te autentifici.

Cod sursa(job #1749984)

Utilizator meriniucrMeriniuc Razvan- Dumitru meriniucr Data 29 august 2016 13:40:52
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>

int tree[100001];
int n;

void
update(int index,
       int val)
{
    for (;index <= n; index += (index & -index))
    {
        tree[index] += val;
    }
}

int
getSum(int beg,
       int end)
{
    int sum;

    sum = 0;
    for (; end; end -= (end & -end))
    {
        sum += tree[end];
    }

    --beg;
    for (; beg; beg -= (beg & -beg))
    {
        sum -= tree[beg];
    }

    return sum;
}

int
getPos(int sum)
{
    int index;
    int bitMask;
    int i;

    for (bitMask = 1; bitMask <= n; bitMask <<= 1);
    bitMask >>= 1;

    index = 0;
    while ( (bitMask) and
            (sum) )
    {
        i = index + bitMask;

        if ( (i <= n) and
             (sum >= tree[i]) )
        {
            sum -= tree[i];
            index = i;
        }

        bitMask >>= 1;
    }

    if ( (not index) or
         (sum) )
    {
        return -1;
    }

    return index;
}


int main()
{
    std::ifstream mama("aib.in");
    std::ofstream tata("aib.out");
    int index;
    int x;
    int y;
    int m;
    int t;

    mama >> n;
    mama >> m;

    for (index = 1; index <= n; ++index)
    {
        mama >> x;
        update(index,
               x);
    }

    for (index = 0; index < m; ++index)
    {
        mama >> t;
        mama >> x;

        if (2 > t)
        {
            mama >> y;
        }

        if (0 == t)
        {
            update(x,
                   y);
        }
        else if (1 == t)
        {
            tata << getSum(x,
                           y) << '\n';
        }
        else
        {
            tata << getPos(x) << '\n';
        }
    }
    return 0;
}