Cod sursa(job #2936827)

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

const long long MOD = 1000000007, vec_len = 100001;

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

long long vec[vec_len], tree[vec_len];

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

  long long 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(long long node, long long l, long long r, long long pos, long long val)
{
  if (l == r)
  {
    tree[node] = val;
    return;
  }

  long long 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]);
}

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

  long long 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());

  long long n, m;
  cin >> n >> m;

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

  seg_build(1, 1, n);

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

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

  return 0;
}