Cod sursa(job #3343854)

Utilizator Gerald123Ursan George Gerald123 Data 28 februarie 2026 16:48:23
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
/// patratele
#include <bits/stdc++.h>
using namespace std;

#define Nmax 100000
#define pb push_back

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

int i, tree[4 * Nmax], v[Nmax], m, n, c, a, b;

void build(int nod, int st, int dr)
{
  if (st == dr)
  {
    tree[nod] = v[st];
    return;
  }
  int m = (st + dr) / 2;
  build(2 * nod, st, m);
  build(2 * nod + 1, m + 1, dr);
  tree[nod] = max(tree[2 * nod], tree[2 * nod + 1]);
}

void up(int p, int st, int dr, int nod, int val)
{
  if (st == dr)
  {
    tree[nod] = val;
    v[p] = val;
    return;
  }
  int m = (st + dr) / 2;
  if (p <= m)
    up(p, st, m, 2 * nod, val);
  else
    up(p, m + 1, dr, 2 * nod + 1, val);
  tree[nod] = max(tree[2 * nod], tree[2 * nod + 1]);
}

int qu(int nod, int st, int dr, int l, int r)
{
  int r1 = -1, r2 = -1;
  if (l <= st && dr <= r)
    return tree[nod];
  int m = (st + dr) / 2;
  if (l <= m)
    r1 = qu(2 * nod, st, m, l, r);
  if (r > m)
    r2 = qu(2 * nod + 1, m + 1, dr, l, r);
  return max(r1, r2);
}

int main()
{
  // ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  fin >> n >> m;
  for (i = 1; i <= n; i++)
    fin >> v[i];
  build(1, 1, n);
  for (i = 1; i <= m; i++)
  {
    fin >> c >> a >> b;
    if (c == 0)
      fout << qu(1, 1, n, a, b) << '\n';
    else
      up(a, 1, n, 1, b);
  }
  return 0;
}