Cod sursa(job #3252998)

Utilizator ana.veronica13Ana Veronica Draghici ana.veronica13 Data 31 octombrie 2024 17:59:41
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;

#define MAX_N 100005

int t[4 * MAX_N], v[4 * MAX_N];

void build( int node, int le, int ri, int *v ){
  if( le == ri ){
    t[node] = v[ri];
    return;
  }
  int mid = ( le + ri ) / 2;
  build( 2 * node, le, mid, v );
  build( 2 * node + 1, mid + 1, ri, v );
  t[node] = max( t[2 * node], t[2 * node + 1] );
}

void update( int node, int le, int ri, int pos, int val ){
  if( le == ri ){
    t[node] = val;
    v[pos] = val;
    return;
  }
  int mid = ( le + ri ) / 2;
  if( pos <= mid ){
    update( 2 * node, le, mid, pos, val );
  }
  else{
    update( 2 * node + 1, mid + 1, ri, pos, val );
  }
  t[node] = max( t[2 * node], t[2 * node + 1] );
}

void query( int node, int le, int ri, int a, int b, int &ans ){
  if( a <= le && ri <= b ){
    ans = max( ans, t[node] );
    return;
  }
  int mid = ( le + ri ) / 2;
  if( a <= mid ){
    query( 2 * node, le, mid, a, b, ans );
  }
  if( b > mid ){
    query( 2 * node + 1, mid + 1, ri, a, b, ans );
  }

}

int main(){
  ifstream cin( "arbint.in" );
  ofstream cout( "arbint.out" );
  int n, m, i, c, x, y;
  cin >> n >> m;
  for( i = 1; i <= n; i++ )
    cin >> v[i];
  build( 1, 1, n, v );
  for( i = 0; i < m; i++){
    cin >> c >> x >> y;
    if( c == 1 )
      update( 1, 1, n, x, y );
    else{
      int mx = -INT_MAX;
      query( 1, 1, n, x, y, mx );
      cout << mx << "\n";
    }
  }
  return 0;
}