Cod sursa(job #855738)

Utilizator mvcl3Marian Iacob mvcl3 Data 15 ianuarie 2013 15:58:57
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<fstream>
using namespace std;

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

const int NMAX = 100001;
int n, m, c[NMAX];

inline void update(int, int);
inline int query(int);
inline int search_min(int);
inline int LSB(int q)
{
    return q & (-q);
}

int main()
{
    f>>n>>m;
    int x, t, y, d;
    for(int i = 1; i <= n; ++i)
    {
        f>>x;
        update(i, x);
    }

    for(; m; --m)
    {
        f>>t;
        if(t < 2)
        {
            f>>x>>y;
            if(!t) update(x, y);
            else g<<query(y) - query(x - 1)<<'\n';
        }
        else
        {
            f>>x;
            g<< search_min(x) <<'\n';
        }
    }

}

inline void update(int poz, int k)
{
    for(; poz <= n; poz += LSB(poz))
        c[poz] += k;
}

inline int query(int poz)
{
    int sum = 0;
    for(; poz > 0; poz -= LSB(poz)) sum += c[poz];

    return sum;
}

inline int search_min(int k)
{
    int poz;
    for(poz = 1; poz < n; poz <<= 1);

    for(int i = 0; poz; poz >>= 1)
    {
        if(i + poz <= n)
        {
            if(c[i + poz] <= k)
            {
                k -= c[i + poz];
                i += poz;
                if(!k) return i;
            }
        }
    }

    return -1;
}