Cod sursa(job #566275)

Utilizator miticaMitica mitica Data 28 martie 2011 20:35:25
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>

#define zero(x) ((x^(x-1))&x)
#define nmax 100005

using namespace std;

int AIB[nmax],n,m,op,st,dr,poz,val,i;

void update(int x,int val)
{
    for(; x<=n; x+=zero(x))
        AIB[x]+=val;
}

int query(int x)
{
    int rez=0;
    for(; x>0; x-=zero(x))
        rez+=AIB[x];
    return rez;
}

int search(int val)
{
    int st=1,dr=n,mij,val2;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        val2=query(mij);
        if(val2==val)
            return mij;
        else if(val2<val)
            st=mij+1;
        else dr=mij-1;
    }

    return -1;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d %d", &n, &m);

    for(i=1; i<=n; i++)
    {
        scanf("%d", &val);
        update(i,val);
    }

    for (; m; --m)
    {
        scanf("%d", &op);
        switch(op)
        {
        case 0:
            scanf("%d %d", &poz, &val);
            update(poz,val);
            break;

        case 1:
            scanf("%d %d", &st, &dr);
            printf("%d\n", query(dr)-query(st-1));
            break;

        case 2:
            scanf("%d", &val);
            printf("%d\n", search(val));
            break;
        }
    }

    return 0;
}