Cod sursa(job #2305861)

Utilizator Robert_VRVRobert Vadastreanu Robert_VRV Data 21 decembrie 2018 11:48:24
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <algorithm>
#include <stdio.h>

const int MAX_N = 100000;

int N, ArbInt[4 * MAX_N];

void update(int nod, int st, int dr, int i, int val) {
  if (st == dr) {
    ArbInt[nod] = val;
  } else {
    int mid = (st + dr) / 2;
    if (i <= mid)
      update(2 * nod, st, mid, i, val);
    else
      update(2 * nod + 1, mid + 1, dr, i, val);
    ArbInt[nod] = std::max(ArbInt[2 * nod], ArbInt[2 * nod + 1]);
  }
}

void update(int i, int val) {
  update(1, 1, N, i, val);
}

int query(int nod, int st, int dr, int begin, int end) {
  if (begin <= st && dr <= end)
    return ArbInt[nod];
  int mid = (st + dr) / 2;
  int ans = 0;
  if (begin <= mid)
    ans = std::max(ans, query(2 * nod, st, mid, begin, end));
  if (mid < end)
    ans = std::max(ans, query(2 * nod + 1, mid + 1, dr, begin, end));
  return ans;
}

int query(int begin, int end) {
  return query(1, 1, N, begin, end);
}


int main() {

  freopen("arbint.in", "r", stdin);
  freopen("arbint.out", "w", stdout);

  int Q;
  scanf("%d%d", &N, &Q);
  int a[1 + N];
  for (int i = 1; i <= N; i++) {
    scanf("%d", &a[i]);
    update(i, a[i]);
  }
  for (int q = 0; q < Q; q++) {
    int c, a, b;
    scanf("%d%d%d", &c, &a, &b);
    if (c == 0)
      printf("%d\n", query(a, b));
    else
      update(a, b);
  }

  fclose(stdin);
  fclose(stdout);

  return 0;
}