Cod sursa(job #1041755)

Utilizator tavi.belu1994FMI Belu Andrei Octavian tavi.belu1994 Data 26 noiembrie 2013 03:48:54
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
#include <iostream>
#include <cstdio>
FILE *f,*g;
using namespace std;

long I[200010][2],T[200010],V[200010][2],Max[200010],F1[200010],F2[200010];

long int calculeaza(long a,long b,long A,long B,long i)
{
    if(a==A && b==B)
    {
        return Max[i];
    }
    else
    {
        if(b <= I[F1[i]][1])
        {
            return calculeaza(a,b,I[F1[i]][0],I[F1[i]][1],F1[i]);
        }
        else
        {
            if(a >= I[F2[i]][0])
            {
                return calculeaza(a,b,I[F2[i]][0],I[F2[i]][1],F2[i]);
            }
            else
            {
                return max(calculeaza(a,I[F1[i]][1],I[F1[i]][0],I[F1[i]][1],F1[i]),calculeaza(I[F2[i]][0],b,I[F2[i]][0],I[F2[i]][1],F2[i]));
            }
        }
    }
}

int main()
{
    f=fopen("arbint.in","r");
    g=fopen("arbint.out","w");
    long i,j,k,N,M,inc=1,sf=1;
    fscanf(f,"%ld%ld",&N,&M);
    for(i=1;i<=N;i++)
    {
        fscanf(f,"%ld",&V[i][0]);
    }
    I[sf][0]=1;
    I[sf][1]=N;
    T[sf]=0;
    while(inc<=sf)
    {
        long a,b;
        if(I[inc][0]==I[inc][1])
        {
            V[I[inc][0]][1]=inc;
            Max[inc]=V[I[inc][0]][0];
            inc++;
        }
        else
        {
            I[++sf][0]=I[inc][0];
            I[sf][1]=I[inc][0]+(I[inc][1]-I[inc][0])/2;
            T[sf]=inc;
            F1[inc]=sf;

            I[++sf][0]=I[inc][0]+(I[inc][1]-I[inc][0])/2 + 1;
            I[sf][1]=I[inc][1];
            T[sf]=inc;
            F2[inc]=sf;

            inc++;
        }
    }

    for(i=sf;i>1;i-=2)
    {
        Max[T[i]]=max(Max[i],Max[i-1]);
    }

    int cod;
    long a,b;
    for(i=1;i<=M;i++)
    {
        fscanf(f,"%d%ld%ld",&cod,&a,&b);
        if(!cod)
        {
            fprintf(g,"%ld\n",calculeaza(a,b,1,N,1));
        }
        else
        {
            long poz;

            poz=V[a][1];
            V[a][0]=b;
            Max[poz]=b;
            if(poz%2==0)
            {
                poz++;
            }
            while(poz>1)
            {
                Max[T[poz]]=max(Max[poz],Max[poz-1]);
                poz=T[poz];
            }
        }
    }

    fclose(f);
    fclose(g);
    return 0;
}