Cod sursa(job #2039341)

Utilizator edi_laitinLaitin Eduard edi_laitin Data 14 octombrie 2017 14:21:18
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
using namespace std;

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

const int NMax = 100000;
int AINT[4 * NMax + 5],V[NMax+5];
int N,M,Max;

void Query(int Nod, int Left, int Right,int QLeft, int QRight)
{
   if(Right<QLeft || Left>QRight)
      return;

   if(Left>=QLeft && Right<=QRight)
       {
           Max=max(Max,AINT[Nod]);
           return;
       }

   int Mid=(Left+Right)/2;

   Query(2*Nod,Left,Mid,QLeft,QRight);
   Query(2*Nod+1,Mid+1,Right,QLeft,QRight);

}
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 Build(int Nod, int Left, int Right)
{
    if(Left == Right)
    {
        AINT[Nod] = V[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]);
}

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

    for(int i = 1; i <= N; ++i)
        {
            fin >> V[i];
        }
    Build(1,1,N);
    while(M--)
    {
        int op,a,b;
        fin >> op >> a >> b;
        if(op == 0)
        {
            Max = 0;
            Query(1,1,N,a,b);
            fout << Max << "\n";
        }

        if(op == 1)
            Update(1,1,N,a,b);
    }
    return 0;
}