Cod sursa(job #3155808)

Utilizator vlad_dimuVlad Dimulescu vlad_dimu Data 9 octombrie 2023 19:22:04
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>
#define MAXN 100000
using namespace std;

ifstream fin( "arbint.in" );
ofstream fout( "arbint.out" );

int v[MAXN + 1];
int aint[4 * MAXN + 1];

void build( int node, int left, int right ){
  if( left == right ){
    aint[node] = v[left];
    return;
  }
  int mij = ( left + right ) / 2;
  build( 2 * node, left, mij );
  build( 2 * node + 1, mij + 1, right );
  aint[node] = max( aint[2 * node], aint[2 * node + 1] );
}

void update( int node, int left, int right, int poz, int val ){
  if( left == right ){
    aint[node] = val;
    return;
  }

  int mij = ( left + right ) / 2;
  if( poz <= mij )
    update( 2 * node, left, mij, poz, val );
  else
    update( 2 * node + 1, mij + 1, right, poz, val );

  aint[node] = max( aint[2 * node], aint[2 * node + 1] );
}

int query( int node, int left, int right, int qleft, int qright ){
  int maxim = -1;
  if( qleft <= left && right <= qright )
    return aint[node];

  int mij = ( left + right ) / 2;
  if( qleft <= mij )
    maxim = max( maxim, query( 2 * node, left, mij, qleft, qright ));
  if( mij < qright )
    maxim = max( maxim, query( 2 * node + 1, mij + 1, right, qleft, qright ));
  return maxim;
}

int main(){
  int n, q, i, c, poz, val, qst, qdr;
  fin >> n >> q;

  for( i = 1; i <= n; i++ )
    fin >> v[i];
  build( 1, 1, n );

  for( i = 1; i <= q; i++ ){
    fin >> c;
    if( c == 1 ){
      fin >> poz >> val;
      update( 1, 1, n, poz, val );
    }
    else{
      fin >> qst >> qdr;
      fout << query( 1, 1, n, qst, qdr ) << '\n';
    }
  }

}