Cod sursa(job #3199975)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 3 februarie 2024 09:53:49
Problema Arbori de intervale Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
// Ilie Dumitru
#include<fstream>
#include<iostream>
const int NMAX=100005, BLK=300;

int N;
int v[NMAX], max[NMAX/BLK+5];

int blockId(int i)
{
	return i/BLK;
}

void init()
{
	int i;
	for(i=0;i<N;++i)
		max[blockId(i)]=std::max(max[blockId(i)], v[i]);
}

int main()
{
	std::ifstream f("arbint.in");
	std::ofstream g("arbint.out");
	int i, Q, op, a, b, M;

	f>>N>>Q;
	for(i=0;i<N;++i)
		f>>v[i];
	for(int _=0;_<Q;++_)
	{
		f>>op>>a>>b;
		if(op==0)
		{
			--a;
			--b;
			M=0;
			for(i=a;i<=b && blockId(i)==blockId(a);++i)
			{
				M=std::max(M, v[i]);
			}
			for(i=b;i>=a && blockId(i)==blockId(b);--i)
			{
				M=std::max(M, v[i]);
			}
			for(i=blockId(a)+1;i<blockId(b);++i)
			{
				M=std::max(M, max[i]);
			}
			g<<M<<'\n';
		}
		else
		{
			--a;
			if(v[a]==max[blockId(a)] && v[a]>b)
			{
				v[a]=b;
				max[blockId(a)]=b;
				for(i=blockId(a)*BLK;i<N && blockId(i)==blockId(a);++i)
					max[blockId(a)]=std::max(max[blockId(a)], v[i]);
			}
			else
			{
				max[blockId(a)]=std::max(max[blockId(a)], b);
				v[a]=b;
			}
		}
	}

	return 0;
}