Cod sursa(job #2936828)

Utilizator LukyenDracea Lucian Lukyen Data 9 noiembrie 2022 16:56:46
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>
using namespace std;

const long long MOD = 1000000007, vec_len = 100002;

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

int vec[vec_len], tree[4 * vec_len];

void seg_build(int node, int l, int r)
{
  if (l == r)
  {
    tree[node] = vec[l];
    return;
  }

  int mid = (l + r) / 2;
  seg_build(node * 2, l, mid);
  seg_build(node * 2 + 1, mid + 1, r);

  tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}

void seg_update(int node, int l, int r, int pos, int val)
{
  if (l == r)
  {
    tree[node] = val;
    return;
  }

  int mid = (l + r) / 2;
  if (pos <= mid)
    seg_update(node * 2, l, mid, pos, val);
  else
    seg_update(node * 2 + 1, mid + 1, r, pos, val);

  tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}

int maxx;
void seg_query(int node, int l, int r, int ql, int qr)
{
  if (ql <= l && r <= qr)
  {
    maxx = max(maxx, tree[node]);
    return;
  }

  int mid = (l + r) / 2;
  if (ql <= mid)
    seg_query(node * 2, l, mid, ql, qr);
  if (qr >= mid + 1)
    seg_query(node * 2 + 1, mid + 1, r, ql, qr);
}

int main()
{
  cin.rdbuf(fin.rdbuf());
  cout.rdbuf(fout.rdbuf());

  int n, m;
  cin >> n >> m;

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

  seg_build(1, 1, n);

  for (int i = 1; i <= m; i++)
  {
    int type;
    cin >> type;

    if (type == 0)
    {
      int ql, qr;
      cin >> ql >> qr;
      maxx = INT_MIN, seg_query(1, 1, n, ql, qr);
      cout << maxx << "\n";
    }
    else
    {
      int pos, val;
      cin >> pos >> val;
      seg_update(1, 1, n, pos, val);
    }
  }

  return 0;
}