Cod sursa(job #1292358)

Utilizator hrazvanHarsan Razvan hrazvan Data 14 decembrie 2014 11:05:32
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.12 kb
#include <stdio.h>
#define MAXN 100000
int arb[4 * MAXN + 1], b, c;

int max2(int a, int b){
  return a > b ? a : b;
}

int query(int p, int st, int dr){
  if(st >= b && dr <= c)
    return arb[p];
  else{
    int m = (st + dr) / 2, max = 0;
    if(b <= m && c >= st)
      max = max2(max, query(p * 2, st, m));
    if(c > m && b <= dr)
      max = max2(max, query(p * 2 + 1, m + 1, dr));
    return max;
  }
}

void update(int p, int st, int dr){
  if(st != dr){
    int m = (st + dr) / 2;
    if(b <= m)
      update(p * 2, st, m);
    else
      update(p * 2 + 1, m + 1, dr);
    arb[p] = max2(arb[2 * p], arb[2 * p + 1]);
  }
  else
    arb[p] = c;
}

int main(){
  FILE *in = fopen("arbint.in", "r");
  FILE *out = fopen("arbint.out", "w");
  int n, m, i, a;
  fscanf(in, "%d%d", &n, &m);
  for(i = 0; i < n; i++){
    fscanf(in, "%d", &c);
    b = i + 1;
    update(1, 1, n);
  }
  for(i = 0; i < m; i++){
    fscanf(in, "%d%d%d", &a, &b, &c);
    if(a == 0)
      fprintf(out, "%d\n", query(1, 1, n));
    else
      update(1, 1, n);
  }
  fclose(in);
  fclose(out);
  return 0;
}