Cod sursa(job #1499110)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 10 octombrie 2015 10:51:47
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <stdio.h>

FILE *fin, *fout;
int a[100023],n,m,t,x,y,z,logn,use;

void update(int p,int v)
{
    for(;p<=n;p+=(p&(p^(p-1))))
    {
        a[p]+=v;
    }
}

int query(int p)
{
    int s=0;
    for(;p>0;p-=(p&(p^(p-1))))
    {
        s+=a[p];
    }
    return s;
}

int query2(int s)
{
    use=logn;
    for(int i=0;use>0;use>>=1)
    {
        if(i+use<=n)
        {
            if(s>=a[i+use])
            {
                i+=use;
                s-=a[i];
                if(s==0)
                {
                    return i;
                }
            }
        }
    }
    return -1;
}

int main()
{
    fin=fopen("aib.in","r");
    fout=fopen("aib.out","w");

    fscanf(fin,"%d %d",&n,&m);

    logn=1;
    while(logn<=n)
    {
        logn<<=1;
    }
    logn>>=1;

    for(int i=1;i<=n;i++)
    {
        fscanf(fin,"%d",&t);
        update(i,t);
    }

    for(int i=0;i<m;i++)
    {
        fscanf(fin,"%d",&x);
        if(x==0)
        {
            fscanf(fin,"%d%d",&y,&z);
            update(y,z);
        }
        else if(x==1)
        {
            fscanf(fin,"%d%d",&y,&z);
            fprintf(fout,"%d\n",query(z)-query(y-1));
        }
        else
        {
            fscanf(fin,"%d",&y);
            fprintf(fout,"%d\n",query2(y));
        }
    }
}