Cod sursa(job #1048217)

Utilizator DaniEsDani Stetcu DaniEs Data 5 decembrie 2013 17:03:20
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
using namespace std;
#define NMax 100005
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N, M;
int AINT[4*NMax],Max;
void Update(int Nod, int Left, int Right, int P, int V)
{
    if(Left==Right)
        {
            AINT[Nod]=V;
        }
    else
        {
            int Mid=(Left+Right)/2;
            if(P<=Mid)
                Update(2*Nod,Left,Mid,P,V);
            else
                Update(2*Nod+1,Mid+1,Right,P,V);
            AINT[Nod]=max(AINT[2*Nod],AINT[2*Nod+1]);
        }
}

void Query(int Nod, int Left, int Right, int QLeft, int QRight)
{
    if (QLeft<=Left && Right<=QRight)
        {
            Max=max(Max,AINT[Nod]);
        }
    else
        {
            int Mid=(Left+Right)/2;
            if(QLeft <= Mid)
                Query(2*Nod,Left,Mid,QLeft,QRight);
            if(QRight > Mid)
                Query(2*Nod+1,Mid+1,Right,QLeft,QRight);
        }
}

int main()
{
    fin>>N>>M;

    for ( int i = 1; i <= N; i++ )
    {
        int X;
        fin>>X;
        Update(1,1,N,i,X);
    }

    for ( int i = 1; i <= M; i++ )
    {
        int X,A,B;
        fin>>X>>A>>B;
        if ( X == 0 )
        {
             Max=-1;
             Query(1,1,N,A,B);
             fout<<Max<<'\n';
        }
        else
        {
            Update(1,1,N,A,B);
        }
    }
}