Cod sursa(job #2204141)

Utilizator daniel.vbVasile Daniel daniel.vb Data 14 mai 2018 18:58:02
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <stdio.h>



unsigned n,m,v[400005];





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

    f=fopen("arbint.in","r");
    g=fopen("arbint.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--)
        if(v[2*i]<v[2*i+1])
            v[i]=v[2*i+1];
        else
            v[i]=v[2*i];

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

}