Cod sursa(job #711813)

Utilizator mytzuskyMihai Morcov mytzusky Data 12 martie 2012 20:00:28
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <iostream>
#include <stdio.h>

#define nn 100010

using namespace std;

int n, m, aib[nn], op, A, B, X;

void update(int poz, int val) // op 0
{
    int p=0;
    while(poz <= n)
    {
        aib[poz] += val;

        while( !(poz & (1<<p) ))
              p++;
        poz += (1<<p);
        p++;
    }
}

int suma(int st, int dr) // op 1
{
    int s_dr=0, s_st=0, p,poz;

    poz=dr, p=0;
    while(poz > 0)
    {
        s_dr += aib[poz];
        while( !(poz & (1<<p)))
            p++;
        poz-=(1<<p);
        p++;
    }

    poz = st-1, p=0;
    while(poz > 0)
    {
        s_st += aib[poz];
        while( !(poz & (1<<p)))
            p++;
        poz-=(1<<p);
        p++;
    }
    return s_dr - s_st;
}

int pmink(int val) // op 2
{
    int poz=1;
    while (poz < n)
        poz = (poz << 1);
    for(int i=0 ; poz >0 ; poz = poz>>1)
        if(i+poz <= n)
            if(val >= aib[i+poz])
            {
                i+=poz;
                val-=aib[i];
                if(!val)
                    return i;
            }
    return -1;
}


void read_and_solve()
{
    freopen ("aib.in","r",stdin);
    freopen ("aib.out","w",stdout);

    scanf("%d %d", &n, &m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d", &X);
        update(i, X);
    }
    for(int i=0;i<m;i++)
    {
        scanf("%d", &op);
        if(op == 0)
        {
            scanf("%d %d", &A, &B);
            update(A,B);
        }
        else if(op == 1)
        {
            scanf("%d %d", &A, &B);
            cout << suma(A,B) << "\n";
        }
        else if (op == 2)
        {
            scanf("%d", &A);
            cout << pmink(A) << "\n";
        }
    }


}

int main()
{

    read_and_solve();


    return 0;
}