Cod sursa(job #3365507)

Utilizator Alias47John Doe Alias47 Data 22 septembrie 2026 08:26:50
Problema Arbori de intervale Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vc;
#define ft(n) for(ull i=1; i<=n; i++)
#define sp ' '
string file = "arbint";
ifstream f(file + ".in");
ofstream g(file + ".out");

const int RADN = 317;
int n, m, q, a, b;
vc v;
vc blocks(320, 0);

void init()
{
	f >> n >> m;
	v.resize(n + 5, 0);
	ft(n)
	{
		f >> v[i];
		blocks[i / RADN] = max(v[i], blocks[i / RADN]);
	}
}

int query(int a, int b)
{
	int maxq = 0;
	int lblock = a / RADN;
	int rblock = b / RADN;
	//g << n << sp << a << sp << b << sp << lblock * RADN << sp << rblock * RADN << endl;
	if (lblock == rblock)
	{
		for (int i = a; i <= b; i++)
			maxq = max(v[i], maxq);
	}
	else
	{
		for (int i = a; i < (lblock + 1) * RADN; i++)
			maxq = max(v[i], maxq);
		for (int i = lblock + 1; i < rblock; i++)
			maxq = max(blocks[i], maxq);
		for (int i = rblock * RADN; i <= b; i++)
			maxq = max(v[i], maxq);
	}
	return maxq;
}

void update(int pos, int val)
{
	int id = pos / RADN;
	if (v[pos] == blocks[id] && v[pos] > val) //possible max loss
	{
		v[pos] = val;
		for (int i = id * RADN; i < (id + 1) * RADN && i < n; i++)
			blocks[id] = max(v[i], blocks[id]);
	}
	else
	{
		v[pos] = val;
		blocks[id] = max(val, blocks[id]);
	}
}

int main()
{
	init();
	ft(m)
	{
		f >> q >> a >> b;
		if (q == 0) g << query(a, b) << "\n";
		else if (q == 1) update(a, b);
	}
}