Cod sursa(job #2242274)

Utilizator alex.cojocaruAlex Cojocaru alex.cojocaru Data 18 septembrie 2018 11:00:16
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <stdio.h>
#include <algorithm>

#define NMAX 2000000

using namespace std;

int aint [ NMAX + 1 ] ;

void update (int a, int b, int st, int dr, int i) {
  int mij = ( st + dr ) / 2 ;
  if (st == dr )
    aint[i] = b ;
  else {
    if (a <= mij )
      update (a, b, st, mij, i*2 ) ;
    else
      update (a, b, mij+1, dr, i*2+1 ) ;
    aint[i] = max (aint[i*2], aint[i*2+1] ) ;
  }
}

int maxint (int left, int right, int st, int dr, int i) {
  if (st == left && dr == right )
    return aint[i] ;
  else {
    int mij = ( st + dr ) / 2 ;
    if (right <= mij )
      return maxint (left, right, st, mij, i*2) ;
    else {if (left > mij )
      return maxint (left, right, mij+1, dr, i*2+1) ;
    else
      return max (maxint(mij, right, mij, dr, i*2+1), maxint(left, mij, st, mij, i*2) ) ;
    }
  }
}

int main() {

  FILE *fin, *fout ;
  fin = fopen ("arbint.in", "r" ) ;
  fout = fopen ("arbint.out", "w" ) ;
  int n, i, m, nr1, nr2, op, elem ;
  fscanf (fin, "%d%d", &n, &m) ;
  for (i = 0 ; i < n ; i ++ ) {
    fscanf (fin, "%d", &elem ) ;
    update (i+1, elem, 1, n, 1 ) ;
  }
  for (i = 0 ; i < m ; i++ ) {
    fscanf (fin, "%d%d%d", &op, &nr1, &nr2 ) ;
    if (op == 1 )
      update (nr1, nr2, 1, n, 1 ) ;
    else
      fprintf (fout, "%d\n", maxint(nr1, nr2, 1, n, 1) ) ;
  }
  return 0;
}