Cod sursa(job #2947561)

Utilizator RolandPetreanPetrean Roland RolandPetrean Data 26 noiembrie 2022 12:52:30
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
// https://infoarena.ro/problema/arbint
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'

ifstream fin("arbint.in");
ofstream fout("arbint.out");

const int MAXN=524288; // 2^19
int n, m, a[MAXN], aint[MAXN];

void build(int node, int l, int r) {
  if (l==r) aint[node] = a[l];
  else {
    int mid=(l+r)/2;
    build(2*node, l, mid);
    build(2*node+1, mid+1, r);
    aint[node] = max(aint[2*node], aint[2*node+1]);
  }
}

void update(int node, int l, int r, int pos, int val) {
  if (l==r) aint[node] = val;
  else {
    int mid=(l+r)/2;
    if (pos<=mid) update(2*node, l, mid, pos, val);
    else update(2*node+1, mid+1, r, pos, val);
    aint[node] = max(aint[2*node], aint[2*node+1]);
  }
}

int get_max(int node, int l, int r, int ql, int qr) {
  if (l >= ql && qr >= r) return aint[node];

  int mid = (l+r)/2, maxi=-1;
  if (ql <= mid) maxi = max(maxi, get_max(2*node, l, mid, ql, qr));
  if (mid < qr) maxi = max(maxi, get_max(2*node+1, mid+1, r, ql, qr));

  return maxi;
}

int main() {
  fin>>n>>m;

  for (int i=1; i<=n; ++i) fin>>a[i];
  build(1, 1, n);

  for (int i=0; i<m; ++i) {
    int c, a, b;
    fin>>c>>a>>b;

    if (c==0) fout<<get_max(1, 1, n, a, b)<<endl;
    else update(1, 1, n, a, b);
  }
}