Cod sursa(job #2801452)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 16 noiembrie 2021 11:40:52
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <cstdio>
#define NMAX 100000

using namespace std;

int n, m;
int v[NMAX + 5], aint[4 * NMAX + 5];

void gen_aint(int poz, int st, int dr) {
  if(st == dr)
    aint[poz] = v[st];
  else {
    gen_aint(2 * poz, st, (st + dr) / 2);
    gen_aint(2 * poz + 1, (st + dr) / 2 + 1, dr);
    aint[poz] = max(aint[2 * poz], aint[2 * poz + 1]);
  }
}

int get_max(int poz, int st, int dr, int a, int b) {
  if(dr < a || st > b)
    return 0;
  if(st >= a && dr <= b)
    return aint[poz];

  int mij = (st + dr) / 2;
  int max_st = get_max(2 * poz, st, mij, a, b);
  int max_dr = get_max(2 * poz + 1, mij + 1, dr, a, b);
  return max(max_st, max_dr);
}

void update(int poz, int st, int dr, int a, int b) {
  if(st == dr) {
    aint[poz] = b;
    return;
  }

  int mij = (st + dr) / 2;
  if(a <= mij)
    update(2 * poz, st, mij, a, b);
  else
    update(2 * poz + 1, mij + 1, dr, a, b);
  aint[poz] = max(aint[2 * poz], aint[2 * poz + 1]);
}

int main() {
  freopen("arbint.in", "r", stdin);
  freopen("arbint.out", "w", stdout);
  int op, a, b;

  scanf("%d %d", &n, &m);
  for(int i = 1; i <= n; i++)
    scanf("%d", &v[i]);

  gen_aint(1, 1, n);
  for(int i = 1; i <= m; i++) {
    scanf("%d %d %d", &op, &a, &b);
    if(op == 0)
      printf("%d\n", get_max(1, 1, n, a, b));
    else
      update(1, 1, n, a, b);
  }

  return 0;
}