Cod sursa(job #490120)

Utilizator Smaug-Andrei C. Smaug- Data 4 octombrie 2010 22:25:19
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>
#define MAXN 100000

int v[4*MAXN+66];

void Update(int node, int lf, int rg, int a, int b, int val){

  if(a <= lf && rg <= b){
    v[node] = val;
    return;
  } else {
    int mid = lf+(rg-lf)/2;
    if(a <= mid)
      Update(2*node, lf, mid, a, b, val);
    if(b > mid)
      Update(2*node+1, mid+1, rg, a, b, val);
    
    v[node]=(v[2*node]>v[2*node+1])? v[2*node]: v[2*node+1];

  }
}
    
void Query(int node, int lf, int rg, int a, int b, int& max){

  int aux;

  if(a <= lf && rg <= b){
    if(max < v[node])
      max = v[node];
    return;
  } else {
    int mid = lf+(rg-lf)/2;
    if(a <= mid)
      Query(2*node, lf, mid, a, b, max);
    if(b > mid)
      Query(2*node+1, mid+1, rg, a, b, max);
  }
}

int main(){

  freopen("arbint.in", "r", stdin);
  freopen("arbint.out", "w", stdout);

  int N, M, i, a, b, aux;
  scanf("%d%d", &N, &M);
  for(i = 1; i <= N; i++){
    scanf("%d", &aux);
    Update(1, 1, N, i, i, aux);
  }
  for(i = 1; i <= M; i++){
    scanf("%d%d%d", &aux, &a, &b);
    if(aux)
      Update(1, 1, N, a, a, b);
    else {
      aux = 0;
      Query(1, 1, N, a, b, aux);
      printf("%d\n", aux);
    }
  }

  return 0;
  
}