Cod sursa(job #1152878)

Utilizator teo.serbanescuTeo Serbanescu teo.serbanescu Data 25 martie 2014 00:46:19
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>

using namespace std;
fstream f("aib.in",ios::in);
fstream g("aib.out",ios::out);

const long nmax=100005;

long n,m,cod,i,x,y;
unsigned long a[nmax];

void modifica(int ind,int val)
{
    long poz=0;
    while (ind<=n)
    {
        a[ind]+=val;
        while ((ind&(1<<poz))==0) poz++;
        ind+=1<<poz;
        poz++;
    }
}

unsigned long suma(int ind)
{
    long poz;
    unsigned long s;
    poz=0;
    s=0;
    while (ind>0)
    {
        s=s+a[ind];
        while ((ind&(1<<poz))==0) poz++;
        ind-=1<<poz;
        poz++;
    }
    return s;
}

long cauta (long val)
{
    int poz=1,i;
    while (poz<n)
    {
        poz=poz<<1;
    }
    for (i=0;poz;poz=poz>>1)
        if (i+poz<=n) if (val>=a[i+poz])
        {
            val=val-a[i+poz];
            i=i+poz;
            if (!val) return i;
        }
    return -1;
}

int main()
{
    f>>n>>m;
    for (i=1;i<=n;i++)
    {
        f>>x;
        modifica(i,x);
    }
    for (i=1;i<=m;i++)
    {
        f>>cod;
        if (cod==0)
        {
            f>>x>>y;
            modifica(x,y);
        }
        if (cod==1)
        {
            f>>x>>y;
            g<<suma(y)-suma(x-1)<<'\n';
        }
        if (cod==2)
        {
            f>>x;
            g<<cauta(x)<<'\n';
        }
    }
    f.close();g.close();
    return 0;
}