Cod sursa(job #2816641)

Utilizator mihaipriboimihailucapriboi mihaipriboi Data 11 decembrie 2021 20:09:01
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.27 kb
// Mihai Priboi

#include <stdio.h>
#include <algorithm>

// parsare

FILE *fin, *fout;

#define BUFFER 1 << 14

char buf[BUFFER];
int buf_index = BUFFER;

inline char read_char() {
  if( buf_index == BUFFER ) {
    fread( buf, 1, BUFFER, fin );
    buf_index = 0;
  }
  return buf[buf_index++];
}

inline int read_int() {
  char ch;
  int n;
  // citim non-cifrele
  ch = read_char();
  while( ch < '0' || ch > '9' )
    ch = read_char();

  n = 0;
  while( ch >= '0' && ch <= '9' ) {
    n = n * 10 + ch - '0';
    ch = read_char();
  }

  return n;
}

//

#define MAXN 100000
#define SQRTN 316

int v[MAXN];
int batog[SQRTN + 1];
int nr_int, int_size;

void construct( int n ) {
  int i, j, max;

  int_size = 1;
  while( int_size * int_size <= n )
    int_size++;
  int_size--;

  nr_int = int_size;
  if( nr_int * int_size < n )
    nr_int++;

  for( i = 0; i < nr_int; i++ ) {
    max = 0;
    for( j = i * int_size; j < (i + 1) * int_size && j < n; j++ )
      max = std::max( max, v[j] );

    batog[i] = max;
  }
}

int getMax( int a, int b ) {
  int max, i, j;

  max = 0;
  j = a;
  i = j / int_size;

  if( j > i * int_size ) {
    i++;
    for( ; j < i * int_size && j <= b; j++ )
      max = std::max( max, v[j] );
  }

  while( b >= (i + 1) * int_size - 1 ) {
    max = std::max( max, batog[i] );
    i++;
  }

  for( j = i * int_size; j <= b; j++ )
    max = std::max( max, v[j] );

  return max;
}

void update( int pos, int val ) {
  int i, j, max;

  i = pos / int_size;

  if( val > batog[i] )
    batog[i] = val;
  else if( v[pos] == batog[i] ) {
    v[pos] = val;
    max = 0;
    for( j = i * int_size; j < (i + 1) * int_size; j++ )
      max = std::max( max, v[j] );

    batog[i] = max;
  }

  v[pos] = val;
}

int main() {
  int n, m, i, a, b, op;
  fin = fopen( "arbint.in", "r" );

  n = read_int(), m = read_int();
  for( i = 0; i < n; i++ )
    v[i] = read_int();

  construct(n);

  fout = fopen( "arbint.out", "w" );

  for( i = 0; i < m; i++ ) {
    op = read_int(), a = read_int(), b = read_int();
    if( op == 0 )
      fprintf( fout, "%d\n", getMax(a - 1, b - 1) );
    else
      update(a - 1, b);
  }

  fclose( fin );
  fclose( fout );
  return 0;
}