Cod sursa(job #1438720)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 20 mai 2015 18:05:00
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#define NMax 100005

using namespace std;

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

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

void Build(int Nod, int Left, int Right)
{
    if(Left == Right)
        {
            AINT[Nod] = X[Left];
            return;
        }

    int Mid = (Left+Right)/2;

    Build(2*Nod,Left,Mid);
    Build(2*Nod+1,Mid+1, Right);

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

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

    int Mid = (Left+Right)/2;

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

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

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

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

    if(Mid+1 <= Finish)
        Query(2*Nod+1,Mid+1,Right,Start,Finish);

}

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

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

    Build(1,1,N);

    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);
    }
    return 0;
}