Cod sursa(job #216521)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 24 octombrie 2008 19:40:44
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <stdio.h>

long v[101000], n, i, j, k, m, p, r, a, b, ras;  

void update(int x, int y)
{
    while(x<=n)
    {
        v[x]+=y;
        x=x+(x&-x);
    }
}

int querry(int x)
{
    int s;
    s=0;
    while(x>0)
    {
        s=s+v[x];
        x=x&(x-1);
    }
    return s;
}

int cauta(int x)
{
    int y, s, p;
    y=1;
    s=0;
    p=0;
    while((y<<1)<=n)
    {
        y=y<<1;
    }
    while(y>0)
    {
        if(s+v[p+y]<a)
        {
            p=p+y;
            s=s+v[p];
        }
        y=y/2;
    }
    return p+1;
}
        
    
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d %d", &n, &m);
    p=1;
    while(p<n)
    {
        p=p<<1;
    }
    for(i=1; i<=n; i++)
    {
        scanf("%d", &a);
        update(i, a);
    }
    for(i=1; i<=m; i++)
    {
        scanf("%d", &r);
        if(r==0)
        {
            scanf("%d %d", &a, &b);
            update(a, b);
        }
        if(r==1)
        {
            scanf("%d %d", &a, &b);
            printf("%d\n", querry(b)-querry(a-1));
        }
        if(r==2)
        {
            scanf("%d", &a);
            ras=cauta(a);
            if(v[ras]==a) printf("%d\n", ras);
        }
    }
    return 0;
}