Cod sursa(job #1335247)

Utilizator Miruna_DMiruna Miruna_D Data 5 februarie 2015 11:53:44
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#define NMax 100005

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int N,M,X[NMax],AINT[4*NMax],Max;

void Update(int Node, int Left, int Right, int Pos, int Value)
{
    if(Left == Right)
        {
            AINT[Node] = Value;
            return;
        }

    int Mid= (Left + Right) / 2;

    if (Pos<=Mid)
        Update(2*Node,Left, Mid,Pos,Value);
    else
        Update(2*Node+1,Mid+1,Right,Pos,Value);

    AINT[Node] = max(AINT[2*Node],AINT[2*Node + 1]);

}

void Query(int Node, int Left, int Right, int Start, int Finish)
{
    if(Start<=Left && Right <= Finish)
        {
            Max = max(Max, AINT[Node]);
            return;
        }
    int Mid = (Left + Right) / 2;

    if(Start<=Mid)
        Query(2*Node,Left, Mid,Start, Finish);

    if(Finish >= Mid + 1)
        Query(2*Node+1,Mid+1,Right, Start, Finish);
}


void Read()
{
    fin>>N>>M;
    for(int i=1;i<=N;i++)
    {
        fin>>X[i];
        Update(1,1,N,i,X[i]);
    }

}



void SolveandPrint()
{
    while(M--)
    {
        int op,x,y;
        fin>>op>>x>>y;
        if(op==0)
            {
                Max = 0;
                Query(1,1,N,x,y);
                fout<<Max<<"\n";
            }
        if(op==1)
            {
                Update(1,1,N,x,y);
            }

    }
}


int main()
{
    Read();
    SolveandPrint();
    return 0;
}