Cod sursa(job #2654510)

Utilizator Iulia25Hosu Iulia Iulia25 Data 1 octombrie 2020 12:49:12
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <fstream>

using namespace std;

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

int n, m, start, type, x, y;
int a[400005];

void Update(int poz)  {
  a[poz] = max(a[poz + poz], a[poz + poz + 1]);
  if (poz == 1)
    return;
  Update(poz / 2);
}

int Query(int st, int dr)  {
  int ans = 0;
  if (st % 2 == 1)
    ans = a[st++];
  if (dr % 2 == 0)  {
    ans = max(ans, a[dr]);
    --dr;
  }
  if (st > dr)
    return ans;
  if (st == dr)
    return max(a[st], ans);
  int aux = Query(st / 2, dr / 2);
  return max(ans, aux);
}

int main()  {
	fin >> n >> m;
	start = 1;
	for (int i = 1; start < n; ++i)
		start <<= 1;
	for (int i = 0; i < n; ++i)  {
		fin >> a[start + i];
		Update((start + i) / 2);
	}
	for (int i = 1; i <= m; ++i)  {
		fin >> type >> x >> y;
		if (type == 1)  {
			a[x + start - 1] = y;
			Update((x + start - 1) / 2);
		} else  {
			fout << Query(x + start - 1, y + start - 1) << '\n';
		}
	}
}