Cod sursa(job #2204081)

Utilizator daniel.vbVasile Daniel daniel.vb Data 14 mai 2018 14:11:51
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <stdio.h>



unsigned n,m,v[400005];





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

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

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

    p2=1;
    while(p2<n)
        p2*=2;
    p2--;

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

    for(i=(n+p2)/2;i>=1;i--)
        v[i]=v[2*i]+v[2*i+1];

    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d%d",&o,&a);
        if(o==0)
        {
            a+=p2;
            fscanf(f,"%d",&b);
            while(a>0)
            {
                v[a]+=b;
                a=a/2;
            }
        }
        if(o==1)
        {
            fscanf(f,"%d",&b);
            a+=p2;b+=p2;
            ssta=0;sdrb=0;
            while(a!=b)
            {
                if(a<b)
                {
                    if(b%2==0)
                        sdrb+=v[b+1];
                    b=b/2;
                }
                else
                {
                    if(a%2==1)
                        ssta+=v[a-1];
                    a=a/2;
                }
            }
                fprintf(g,"%d\n",v[a]-ssta-sdrb);
        }
        if(o==2)
        {
            j=p2+1;
            while(j>0 && v[j]<a)
                j=j/2;
            if(j>0)
                while(j<=p2)
                {
                    if(v[2*j]>=a)
                        j=2*j;
                    else
                    {
                        j=2*j+1;
                        a=a-v[j-1];
                    }

                }
            if(a==v[j])
                fprintf(g,"%d\n",j-p2);
            else
                fprintf(g,"-1\n");
        }
    }

}