Cod sursa(job #2926837)

Utilizator Luka77Anastase Luca George Luka77 Data 18 octombrie 2022 19:38:49
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1e5+5;
int arb[4 * NMAX];

ifstream f("arbint.in");
ofstream g("arbint.out");

int N, Q;
int ans;
int v[NMAX];

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

  int mid = (st + dr) / 2;
  if (pos <= mid)
    {
      update (2 * node, st, mid, pos, val);
    }
  else
    {
      update (2 * node + 1, mid + 1, dr, pos, val);
    }
  arb[node] = max (arb[2 * node], arb[2 * node + 1]);
}

void query (int node, int arbSt, int arbDr, int st, int dr)
  {
    if (arbDr < st || arbSt > dr)
      return;

    if (arbSt >= st && arbDr <= dr)
      {
	ans = max (ans, arb[node]);
	return;
      }

    int mid = (arbSt + arbDr) / 2;

    query (2 * node, arbSt, mid, st, dr);
    query (2 * node + 1, mid + 1, arbDr, st, dr);
  }


int main ()
{
  f >> N >> Q;
  for (int i = 1; i <= N; ++i)
    {
      f >> v[i];
      update (1, 1, N, i, v[i]);
    }

  bool tip;
  int a, b;
  while (Q --)
    {
      f >> tip >> a >> b;

      if (!tip)
	{
	  ans = 0;
	  query (1, 1, N, a, b);
	  g << ans << "\n";
	}
      else
	{
	  update (1, 1, N, a, b);
	}
    }

  return 0;
}