Cod sursa(job #1264266)

Utilizator IoanZioan zahiu IoanZ Data 15 noiembrie 2014 17:40:02
Problema Arbori indexati binar Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdio.h>

int aib[100001],n;

int querry (int ind)
{
    int s;
    s=0;
    for(;ind!=0;ind=ind-((ind&(ind-1))^ind))
        s=s+aib[ind];
    return s;

}

void update (int ind,int nr)
{
    for (;ind<=n;ind=ind+((ind&(ind-1))^ind))
         aib[ind]=aib[ind]+nr;
}

int cautare(int nr)
{
    int i,ind;
    for (ind=1;ind<n;ind=ind<<1);
        for (i=0;ind!=0;ind=ind/2)
        {
            if (i+ind<=n)
            {
                if(nr>=aib[i+ind])
                {
                    i=i+ind;
                    nr=nr-aib[i];
                    if (nr==0)
                        return i;
                }
            }
        }
    return -1;
}
int main()
{
    FILE *f1,*f2;
    int m,i,a,b,stg;
    f1=fopen("aib.in","r");
    f2=fopen("aib.out","w");
    fscanf(f1,"%d%d",&n,&m);
    for (i=1;i<=n;i++)
    {
        fscanf(f1,"%d",&a);
        update(i,a);
    }
    for (i=0;i<m;i++)
    {
        fscanf(f1,"%d",&stg);
        if (stg<2)
        {
            fscanf(f1,"%d%d",&a,&b);
            if (stg==0)
                update(a,b);
            else
                fprintf(f2,"%d\n",querry(b)-querry(a-1));
        }
        else
        {
            fscanf(f1,"%d",&a);
            fprintf(f2,"%d\n",cautare(a));
        }
    }
    fclose(f1);
    fclose(f2);
    return 0;
}