Cod sursa(job #2021946)

Utilizator DruffbaumPopescu Vlad Druffbaum Data 15 septembrie 2017 00:01:50
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <cstdio>
#include <cctype>

#define BUF_SIZE 1 << 12
const int MAXN = 1e5 + 6e4;

int aint[2 * MAXN + 1], a, b;
char buf[BUF_SIZE];
int pos = BUF_SIZE;

inline char getChar(FILE *f) {
  if (pos == BUF_SIZE) {
    fread(buf, 1, BUF_SIZE, f);
    pos = 0;
  }
  return buf[pos++];
}

inline int read(FILE *f) {
  int r = 0;
  char c;
  do {
    c = getChar(f);
  } while (!isdigit(c));
  do {
    r = 10 * r + c - '0';
    c = getChar(f);
  } while (isdigit(c));
  return r;
}

inline int max(int x, int y) {
  return x > y ? x : y;
}

void update(int poz, int l, int r) {
  if (l == r) {
    aint[poz] = b;
  } else {
    int mid = (l + r) >> 1;
    if (a <= mid) {
      update(2 * poz, l, mid);
    } else {
      update(2 * poz + 1, mid + 1, r);
    }
    aint[poz] = max(aint[2 * poz], aint[2 * poz + 1]);
  }
}

int query(int poz, int l, int r) {
  if ((a <= l) && (r <= b)) {
    return aint[poz];
  }
  int mid = (l + r) >> 1,
      max1 = 0, max2 = 0;
  if (a <= mid) {
    max1 = query(2 * poz, l, mid);
  } 
  if (mid < b) {
    max2 = query(2 * poz + 1, mid + 1, r);
  }
  return max(max1, max2);
}

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