Cod sursa(job #566554)

Utilizator DuxarFII-Stefan-Negrus Duxar Data 29 martie 2011 09:52:40
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include<cstdio>
#define nmax 100001
using namespace std;

int N,M,a[nmax];

void sum(int in,int val);
void solve();
int inv(int in,int sf);
int dets(int in);
int search(int val);

int main()
{
    freopen ("aib.in","r",stdin);
    freopen ("aib.out","w",stdout);

    solve();

    return 0;
}

void solve()
{
    int i,c,val,in,sf;
    scanf("%d%d",&N,&M);
    for (i=1;i<=N;++i)
    {
        scanf("%d",&c);
        sum(i,c);
    }
    for (i=1;i<=M;++i)
    {
        scanf("%d",&c);
        if (!c)
        {
            scanf("%d%d",&in,&val);
            sum(in,val);
        }
        else if (c==1)
        {
            scanf("%d%d",&in,&sf);
            printf("%d\n",inv(in,sf));
        }
        else
        {
            scanf("%d",&in);
            printf("%d\n",search(in));
        }
    }
}

void sum(int in,int val)
{
    int poz=0;
    while(in<=N)
    {
        a[in]+=val;
        while (!(in&1<<poz)) poz++;
        in+=1<<poz;
        poz++;
    }
}

int inv(int in,int sf)
{
    int s1=dets(sf);
    int s2=dets(in-1);
    return s1-s2;
}

int dets(int in)
{
    int s=0,poz=0;
    while (in)
    {
        s+=a[in];
        while(!(in&1<<poz)) ++poz;
        in-=1<<poz;
        ++poz;
    }
    return s;
}

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