Cod sursa(job #937939)

Utilizator antonioteoZait Teodor Antonio antonioteo Data 11 aprilie 2013 13:14:25
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <cmath>
#include <algorithm>
using namespace std;
const char iname[] = "arbint.in";
const char oname[] = "arbint.out";
ifstream fin(iname);
ofstream fout(oname);
int N, M, a, b, cod_op, bucket_max, i, j, rad, ind_dr, ind_st, last_dr, nrg = 1;
struct bucket{
	int val, g_ind;
}v[100004];
struct up2date{
	int mv;
	int st, dr;
}G[10004];
inline void update (int poz, int x){
	v[poz].val = x; 
	bucket_max = 0;
	i = v[poz].g_ind;
	for (j = G[i].st; j <= G[i].dr; ++j)
		bucket_max = max(bucket_max, v[j].val);
	G[i].mv = bucket_max;
}
inline int query (int x, int y)
{
	int Q_ANS = 0;
	int mxv = 0;
	ind_st = v[x].g_ind; ind_dr = v[y].g_ind;
	for (i = y; i >= G[ind_dr].st; --i)
		mxv = max(mxv, v[i].val);
	for (i = x; i <= G[ind_st].dr; ++i)
		mxv = max(mxv, v[i].val);
	Q_ANS = max(Q_ANS, mxv);
	ind_st += 1; ind_dr -= 1;
	for (i = ind_st; i <= ind_dr; ++i)
		Q_ANS = max(Q_ANS, G[i].mv);
	return Q_ANS;
}
int main()
{
	fin >> N >> M; rad = sqrt(1.0 * N);
	for (i = 1, j = 1; i <= N; ++i, ++j)
	{
		fin >> v[i].val; v[i].g_ind = nrg;
		bucket_max = max(bucket_max, v[i].val);
		if (j == rad)
		{
			G[nrg].mv = bucket_max;
			G[nrg].dr = i; last_dr = i;
			G[nrg].st = i - rad + 1;
			bucket_max = 0, j = 0, ++nrg;
		}
	}
	G[nrg].st = last_dr; G[nrg].dr = N;
	for (i = last_dr + 1; i <= N; ++i)
		bucket_max = max(bucket_max, v[i].val);
	G[nrg].mv = bucket_max;
	while (M--)
	{
		fin >> cod_op; 
		if (cod_op){
			fin >> a >> b; 
			update(a, b);
		}
		else{
			fin >> a >> b;
			fout << query(a, b) << '\n';
		}
	}
	return 0;
}