Cod sursa(job #333528)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 23 iulie 2009 09:14:32
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<stdio.h>
#define DIM 100001 
int n,aib[DIM];
int lsb (int x)
{
    return x&(x-1)^x;    
}
void add (int poz,int val)
{
    for(;poz<=n;poz+=lsb(poz))
        aib[poz]+=val;
}
int query (int poz)
{
    int s=0;
    for(;poz!=0;poz-=lsb(poz))
        s+=aib[poz];
    return s;
}
int cbin (int val)
{
    int st=1,dr=n,nr,mij;
    while(st<=dr)
    {
       mij=(st+dr)/2;
       nr=query(mij);
       if(val==nr)
            return mij;
        else if(nr<val)
                st=mij+1;
            else
                dr=mij-1;
    }
    return -1;
}
int main ()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int i,m,nr,q,a,b;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
        scanf("%d",&nr),add(i,nr);
    for(i=1;i<=m;++i)
    {
        scanf("%d",&q);
        switch (q)
        {
            case 0:scanf("%d%d",&a,&b),add(a,b);break;
            case 1:scanf("%d%d",&a,&b),printf("%d\n",query(b)-query(a-1));break;
            case 2:scanf("%d",&a),printf("%d\n",cbin(a));break;
        }
    }
    return 0;
}