Cod sursa(job #178307)

Utilizator alecmanAchim Ioan Alexandru alecman Data 14 aprilie 2008 13:23:56
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<stdio.h>

#define INPUT "arbint.in"
#define OUTPUT "arbint.out"
#define NMAX 100001

FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");

long N, M, X, Y, Maxim;
long A[ NMAX ], Arb[ 5 * NMAX ];
int code;

void readNew()
{
  fscanf(fin, "%d %ld %ld", &code, &X, &Y);
}

inline long MAX(long NODE)
{
  if(Arb[ 2 * NODE ] > Arb[ 2 * NODE + 1 ])
    return Arb[ 2 * NODE];
  
  return Arb[ 2 * NODE + 1];
}

void update(long node, long left, long right)
{
  long middle;

  if(left == right)
  {
    Arb[ node ] = Y;
    return;
  }
  middle = (left + right) >> 1;

  if(X <= middle)
    update(2 * node, left, middle);
  else
    update(2 * node + 1, middle + 1, right);

  Arb[ node ] = MAX( node );
}

void query(long node, long left, long right)
{
  long middle;

  if(X <= left && right <= Y)
  {
    if(Maxim < Arb[ node ])
      Maxim = Arb[ node ];
    return;
  }
  middle = (left + right) >> 1;

  if(middle >= X) query(2 * node, left, middle);
  if(middle < Y) query(2 * node + 1, middle + 1, right);
}

void readValues()
{
  fscanf(fin, "%ld %ld", &N, &M);

  for(long i = 1; i <= N; ++i)
  {
    fscanf(fin, "%ld", &A[ i ]);
    X = i;
    Y = A[ i ];
    update(1,1,N);
  }
}

int main()
{
  readValues();

  for(long i = 0; i < M; ++i)
  {
    readNew();

    if(code)
      update(1, 1, N);
    else
    {
      Maxim = 0;

      query(1, 1, N);

      fprintf(fout, "%ld\n", Maxim);
    }
  }

  fclose(fin);
  fclose(fout);

  return 0;
}