Cod sursa(job #3216323)

Utilizator mihaipriboimihailucapriboi mihaipriboi Data 15 martie 2024 21:11:03
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
// Mihai Priboi

#include <stdio.h>
#include <algorithm>

using namespace std;

#define MAX_N 100000

int v[MAX_N], aint[MAX_N * 2];

void init(int l, int r, int u) {
  int mid = (r + l) / 2;
  int lc = u + 1;
  int rc = u + 2 * (mid - l + 1);

  if (l == r) {
    aint[u] = v[l - 1];
  } else {
    init(l, mid, lc);
    init(mid + 1, r, rc);

    aint[u] = max(aint[lc], aint[rc]);
  }
}

int query(int a, int b, int l, int r, int u) {
  int mid = (r + l) / 2;
  int lc = u + 1;
  int rc = u + 2 * (mid - l + 1);

  if (a == l && b == r)
    return aint[u];

  int mx = 0;

  if (a <= mid) mx = max(mx, query(a, min(b, mid), l, mid, lc));
  if (b > mid) mx = max(mx, query(max(a, mid + 1), b, mid + 1, r, rc) );

  return mx;
}

void update(int pos, int val, int l, int r, int u) {
  int mid = (r + l) / 2;
  int lc = u + 1;
  int rc = u + 2 * (mid - l + 1);

  if (l == r) {
    aint[u] = val;
  } else {
    if (pos <= mid) update(pos, val, l, mid, lc);
    if (pos > mid) update(pos, val, mid + 1, r, rc);

    aint[u] = max(aint[lc], aint[rc]);
  }
}

int main() {
  FILE *fin, *fout;
  int n, q;

  fin = fopen("arbint.in", "r");
  fout = fopen("arbint.out", "w");

  fscanf(fin, "%d%d", &n, &q);

  for (int i = 0; i < n; i++)
    fscanf(fin , "%d", &v[i]);

  init(1, n, 0);

  while (q--) {
    int c, a, b;
    fscanf(fin, "%d%d%d", &c, &a, &b);
    
    if (c == 0) {
      fprintf(fout, "%d\n", query(a, b, 1, n, 0));
    } else {
      update(a, b, 1, n, 0);
    }
  }

  fclose(fin);
  fclose(fout);
  return 0;
}