Cod sursa(job #1478893)

Utilizator ConsstantinTabacu Raul Consstantin Data 29 august 2015 20:46:31
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>
#define IN_FILE_NAME "arbint.in"
#define OUT_FILE_NAME "arbint.out"
#define NMAX 3000000
#define INF -1000000000
FILE *in, *out;
int N,M;
int arbMax[NMAX];

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

void update(int nod, int left, int right, int pos, int val) {
  if (right == left) {
    arbMax[nod] = val;
  } else if (right < left){
    return ;
  } else {
    int mid;
    mid = (left + right) >> 1;
    if (pos <= mid) {
      update(2*nod, left, mid, pos, val);
    } else {
      update(2*nod+1, mid+1, right, pos, val);
    }
    arbMax[nod] = max(arbMax[2*nod], arbMax[2*nod+1]);
  }
}

int query(int nod, int start, int end, int left, int right) {
  int mid;
  if (start <= left && end >= right) {
    return arbMax[nod];
  }else if (end < left || start > right) {
    return INF;
  } else {
    mid = (left + right) >> 1;
    return max(
      query(2*nod, start, end, left, mid),
      query(2*nod+1, start, end, mid+1, right)
    );
  }
}

void read() {
  int val;
  fscanf(in, "%d %d", &N, &M);
  for (int i = 1 ; i <= N ; i++) {
    fscanf(in, "%d ", &val);
    update(1, 1, N, i, val);
  }
}

void solve() {
  int op, a,b;
  for(int i = 0 ; i < M ; i++) {
    fscanf(in, "%d %d %d", &op, &a, &b);
    if (op == 0) {
      fprintf(out, "%d\n", query(1, a, b, 1, N));
    } else {
      update(1, 1, N, a, b);
    }
  }
}

int main() {
  in = fopen(IN_FILE_NAME, "r");
  out = fopen(OUT_FILE_NAME, "w");
  read();
  solve();
  fclose(in);
  fclose(out);
  return 0;
}