Cod sursa(job #2805118)

Utilizator victorzarzuZarzu Victor victorzarzu Data 21 noiembrie 2021 13:34:16
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
#define oo 0x3f3f3f3f

using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m, x, y, z, arb[4 * 500000 + 50], maximum;

void update(int left, int right, int node, int pos, int val)
{
  if(left == right)
  {
    arb[node] = val;
    return;
  }

  int mid = (left + right) >> 1;

  if(pos <= mid)
    update(left, mid, 2 * node, pos, val);
  else
    update(mid + 1, right, 2 * node + 1, pos, val);
  
  arb[node] = max(arb[node * 2], arb[node * 2 + 1]);
}

void query(int left, int right, int node, int a, int b, int *maximum)
{
  if(a <= left && right <= b)
  {
    *maximum = max(*maximum, arb[node]);
    return;
  }

  int mid = (left + right) >> 1;

  if(mid >= a)
    query(left, mid, 2 * node, a, b, maximum);
  if(mid < b)
    query(mid + 1,  right, 2 * node + 1, a, b, maximum);
}

void read()
{
  f>>n>>m;
  for(int i = 1;i <= n;++i)
    f>>x, update(1, n, 1, i, x);
}

void solve()
{
  for(int i = 1;i <= m;++i)
  {
    f>>x>>y>>z;
    if(!x)
      {
        maximum = -1;
        query(1, n, 1, y, z, &maximum);
        g<<maximum<<'\n';
      }
    else
      update(1, n, 1, y, z);
  }
}


int main()
{
  read();
  solve();
  return 0;
}