Cod sursa(job #3258901)

Utilizator ultra980Alex Stan ultra980 Data 24 noiembrie 2024 11:28:36
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <stdio.h>

const int NMAX = 100'000;
int aint[4 * NMAX], n, m;

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

void update(int poz, int val) {
  poz += n;
  aint[poz] = val;
  for (poz /= 2; poz; poz >>= 1) {
    aint[poz] = max(aint[2 * poz], aint[2 * poz + 1]); 
  }
}

int query(int l, int r) {
  int mx;
  l += n;
  r += n;

  mx = -1;
  while (l <= r) {
    if (l & 1) {
      mx = max(mx, aint[l++]);
    }
    l >>= 1;

    if (!(r & 1)) {
      mx = max(mx, aint[r--]);
    }
    r >>= 1;
  }

  return mx;
}

void read_input(FILE *fin) {
  fscanf(fin, "%d%d", &n, &m);
  for (int i = 0; i < n; i++) {
    int num;
    fscanf(fin, "%d", &num);
    update(i, num);
  }
}

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

  return 0;
}