Cod sursa(job #1953772)

Utilizator stefan_bogdanstefan bogdan stefan_bogdan Data 4 aprilie 2017 23:59:32
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <stdio.h>

#define InFile "arbint.in"
#define OutFile "arbint.out"

#define MAXN 100003

using namespace std;

int N, M;
int Arb[ 0x3 * MAXN ];
int X, Pos, Val, A, B;

inline void SearchAndUpdate(int Nod, int Left, int Right)
{
  if (Left == Right)
  {
    Arb[ Nod ] = (Val); return;
  }

  int Mid((Right + Left) >> 0x1);

  if (Pos <= Mid)
    SearchAndUpdate((Nod << 0x1), Left, Mid);
  else
    SearchAndUpdate((Nod << 0x1) + 0x1, Mid + 0x1, Right);

  Arb[ Nod ] = ( max(Arb[ (Nod << 0x1) ], Arb[ (Nod << 0x1) + 0x1]) );

}

inline int Query(int Nod, int Left, int Right)
{
  if (Left >= A && B >= Right)
  {
    return Arb[ Nod ];
  }

  int Mid((Right + Left) >> 0x1);
  int Answer1(-0x1), Answer2(-0x1);

  if (Mid >= A) Answer1 = Query((Nod << 0x1), Left, Mid);
  if (Mid < B)  Answer2 = Query((Nod << 0x1) + 0x1, Mid + 0x1, Right);

  return max(Answer1, Answer2);
}

void Solve(void)
{
  FILE * f = fopen(InFile, "r");
  FILE * g = fopen(OutFile, "w");

  fscanf(f, "%d %d", &N, &M);

  for (int i( 0x1 ); i <= N; i++)
  {
    fscanf(f, "%d", &X);
    Pos = i ; Val = X ;
    SearchAndUpdate(0x1, 0x1, N);
  }

  for (int i( 0x1 ); i <= M; i++)
  {
    fscanf(f, "%d %d %d", &X, &A, &B);
    if (X == 0x0)
    {
      fprintf(g, "%d\n", Query(0x1, 0x1, N));
    }
    else
    {
      Pos = A; Val = B;
      SearchAndUpdate(0x1, 0x1, N);
    }
  }

  fclose(f);
  fclose(g);
}

int main()
{
  Solve();
}