Cod sursa(job #2204080)

Utilizator daniel.vbVasile Daniel daniel.vb Data 14 mai 2018 14:08:46
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <stdio.h>

unsigned n,m,v[100005],x[100005];



unsigned abi(int i,int j)
{
    int mij;
    if(i==j){
        x[i]=v[i];
        return v[i];
    }
    mij=(i+j)/2;
    x[mij]=abi(i,mij)+abi(mij+1,j);
    return x[mij];
}


unsigned query(int i,int j,int st,int dr)
{
    unsigned mij,sst,sdr;
    if(i>dr || j<st ||st>dr)
        return 0;
    mij=(st+dr)/2;
    if(st==dr)
        return v[st];
    if(i<=st && j>=dr)
        return x[mij];
    sst=query(i,j,st,mij);
    sdr=query(i,j,mij+1,dr);
    return sst+sdr;
}

int actualizare(int i,int j,int st, int dr,int k)
{
    int mij,nst,ndr,act;

    if(i>dr || j<st ||st>dr)
        return 0;
    if(dr==st)
    {
        v[st]+=k;
        return 1;
    }

    mij=(st+dr)/2;
    nst=actualizare(i,j,st,mij,k);
    ndr=actualizare(i,j,mij+1,dr,k);
    act=nst+ndr;
    x[mij]+=act*k;
    return act;
}

int cauta(int st,int dr,int a)
{
    unsigned mij=(st+dr)/2,sst;
    if(x[mij]<a || st>dr)
        return -1;
    if(st==dr && v[st]==a)
        return st;
    if(x[mij]==a)
        return dr;
    sst=query(1,mij,1,mij);
    if(sst>=a)
        cauta(1,mij,a);
    else
        cauta(mij+1,dr,a-sst);
}

int main()
{
    unsigned i,j,k,o,a,b,p1,p2;
    FILE *f,*g;

    f=fopen("aib.in","r");
    g=fopen("aib.out","w");

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


    for (i=1;i<=n;i++)
        fscanf(f,"%d",&v[i]);

    abi(1,n);

    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d%d",&o,&a);
        if(o==0)
        {
            fscanf(f,"%d",&b);
            actualizare(a,a,1,n,b);
        }
        if(o==1)
        {
            fscanf(f,"%d",&b);
            fprintf(g,"%d\n",query(a,b,1,n));
        }
        if(o==2)
                fprintf(g,"%d\n",cauta(1,n,a));
    }

}