Cod sursa(job #1119579)

Utilizator StanAndreiAndrei Stan StanAndrei Data 24 februarie 2014 18:39:45
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <stdio.h>

#define NMAX 400005

using namespace std;

int ARB[NMAX],N,M,X,A,B;

int start,finish,val,poz,MAX;

int max(int a,int b)
{
    if (a>b) return a;
    return b;
}

void update(int nod,int left,int right)
{
    if (left==right)
    {
        ARB[nod]=val;
        return;
    }

    int div=(left+right)/2;
    if (poz<=div)
        update(2*nod,left,div);
    else
        update(2*nod+1,div+1,right);

    ARB[nod]=max(ARB[2*nod],ARB[2*nod+1]);
}

void query(int nod,int left,int right)
{
    if (start<=left && right<=finish)
    {
        if (MAX<ARB[nod]) MAX=ARB[nod];
        return ;
    }

    int div=(left+right)/2;
    if (start<=div)
        query(2*nod,left,div);
    if (div<finish)
        query(2*nod+1,div+1,right);
}

int main()
{
    freopen ("arbint.in","r",stdin);
    freopen ("arbint.out","w",stdout);

    scanf("%d %d\n",&N,&M);
    for (int i=1;i<=N;i++)
    {
        scanf("%d ",&X);
        poz=i;
        val=X;
        update(1,1,N);
    }

    for (int i=1;i<=M;i++)
    {
        scanf("%d %d %d\n",&X,&A,&B);
        if (!X)
        {
            MAX=-1;
            start=A;
            finish=B;
            query(1,1,N);
            printf("%d\n",MAX);
        }
        else
        {
            poz=A;
            val=B;
            update(1,1,N);
        }
    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}