Cod sursa(job #2783274)

Utilizator YusyBossFares Yusuf YusyBoss Data 14 octombrie 2021 09:36:46
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#define NMAX 100000

using namespace std;

ifstream cin ("arbint.in");
ofstream cout ("arbint.out");

int aint[4 * NMAX + 3], v[NMAX + 3 ];

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

void build_aint(int node, int st, int dr) {
  if (st == dr) {
    aint[node] = v[st];
    return;
  }

  int mid = (st + dr) / 2;
  build_aint(node * 2, st, mid);
  build_aint(node * 2 + 1, mid + 1, dr);
  aint[node] = join(aint[node * 2], aint[node * 2 + 1]);
}

void update(int node, int st, int dr, int poz, int val) {
  if (st == dr) { /// daca am ajuns pe pozitia poz
    aint[node] = val;
    return;
  }

  int mid = (st + dr) / 2;
  if (poz <= mid)
    update(node * 2, st, mid, poz, val);
  else
    update(node * 2 + 1, mid + 1, dr, poz, val);

  aint[node] = join(aint[node * 2], aint[node * 2 + 1]);
}

int query(int node, int st, int dr, int lfind, int rfind) {
  if (lfind <= st && rfind >= dr)
    return aint[node];

  int sol = 0;
  int mid = (st + dr) / 2;
  if (lfind <= mid)
    sol = join(sol, query(node * 2, st, mid, lfind, rfind));
  if (rfind > mid)
    sol = join(sol, query(node * 2 + 1, mid + 1, dr, lfind, rfind));

  return sol;
}

int main() {
  int n, m, i, op, a, b;
  cin >> n >> m;

  for (i = 1; i <= n; i++)
    cin >> v[i];

  build_aint(1, 1, n);

  while (m--) {
    cin >> op >> a >> b;

    if (op == 0)
      cout << query(1, 1, n, a, b) << "\n";
    else
      update(1, 1, n, a, b);
  }
  return 0;
}