Cod sursa(job #826273)

Utilizator maritimCristian Lambru maritim Data 30 noiembrie 2012 15:30:12
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<stdio.h>

FILE *f = fopen("arbint.in","r");
FILE *g = fopen("arbint.out","w");

#define MaxN 100100
#define mij ((li+ls)>>1)
#define fs (poz<<1)
#define fd ((poz<<1)+1)

int N,M;
int A[MaxN],AINT[4*MaxN];

void citire(void)
{
    fscanf(f,"%d %d",&N,&M);
    for(int i=1;i<=N;i++)
        fscanf(f,"%d ",&A[i]);
}

inline int max(int a,int b)
{
    return a > b ? a : b;
}

inline void build(int li,int ls,int poz)
{
    if(li == ls)
    {
        AINT[poz] = A[li];
        return ;
    }

    build(li,mij,fs);
    build(mij+1,ls,fd);

    AINT[poz] = max(AINT[fs],AINT[fd]);
}

inline void insert(int li,int ls,int poz,int pozVal,int val)
{
    if(li == ls)
    {
        AINT[poz] = val;
        return ;
    }

    if(pozVal >= li && pozVal <= mij)
        insert(li,mij,fs,pozVal,val);
    else
        insert(mij+1,ls,fd,pozVal,val);

    AINT[poz] = max(AINT[fs],AINT[fd]);
}

inline int querry(int li,int ls,int poz,int a,int b)
{
    int Max = 0;

    if(a <= li && ls <= b)
        return AINT[poz];

    if(a <= mij)
        Max = max(Max,querry(li,mij,fs,a,b));
    if(b > mij)
        Max = max(Max,querry(mij+1,ls,fd,a,b));

    return Max;
}

int main()
{
    int op,a,b;

    citire();
    build(1,N,1);
    for(int i=1;i<=M;i++)
    {
        fscanf(f,"%d %d %d",&op,&a,&b);
        switch(op)
        {
            case 0 : fprintf(g,"%d\n",querry(1,N,1,a,b));
                break;
            default : insert(1,N,1,a,b);
        }
    }
}