Cod sursa(job #3297276)

Utilizator Arhiva_Educationala_2Arhiva Educationala doi Arhiva_Educationala_2 Data 22 mai 2025 12:54:26
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <stdio.h>
#include <algorithm>

const int MAXN = (1 << 17);
int aint[2 * MAXN];
int aintn;

void init( int n ) {
  aintn = 1;
  while( aintn < n )
    aintn <<= 1;
}

void pull( int i ) {
  aint[i] = std::max( aint[i * 2 + 1], aint[i * 2 + 2] );
}

void build() {
  for( int i = aintn - 1; i--; )
    pull( i );
}

void update( int idx, int val ) {
  idx += aintn - 1;
  aint[idx] = val;
  while( idx ){
    idx = (idx - 1) >> 1;
    pull( idx );
  }
}

int query( int st, int dr ) {
  int ret = 0;
  st += aintn - 1;
  dr += aintn - 1;

  while( st < dr ){
    if( !(st & 1) ) ret = std::max( ret, aint[st++] );
    if( dr & 1 ) ret = std::max( ret, aint[dr--] );

    st = (st - 1) >> 1;
    dr = (dr - 1) >> 1;
  }

  if( st == dr )
    ret = std::max( ret, aint[st] );
  return ret;
}

int main() {
  FILE *fin = fopen( "arbint.in", "r" );
  FILE *fout = fopen( "arbint.out", "w" );

  int n, m;
  fscanf( fin, "%d%d", &n, &m );
  init( n );

  for( int i = 0; i < n; i++ )
    fscanf( fin, "%d", &aint[aintn - 1 + i] );
  build();

  for( int i = 0; i < m; i++ ){
    int task, a, b;
    fscanf( fin, "%d%d%d", &task, &a, &b );

    if( task == 0 )
      fprintf( fout, "%d\n", query( --a, --b ) );
    else
      update( --a, b );
  }

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