Cod sursa(job #216546)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 24 octombrie 2008 20:16:53
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 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)   
{   
    long y, s, p;   
    y=1;   
    s=0;   
    p=0;   
    while((y<<1)<n)   
    {   
        y=y<<1;   
    }   
    while(y>0)   
    {  
        if(s+v[p+y]<=x)   
        {   
            p=p+y;   
            s=s+v[p];   
            if (s==a) return p;
        }  
        y=y/2;     
    }   
    return -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);   
            printf("%d\n", cauta(a));
        }   
    }   
    return 0;   
}