Cod sursa(job #1059290)

Utilizator sorin2kSorin Nutu sorin2k Data 16 decembrie 2013 15:44:06
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<fstream>
using namespace std;

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

// avem 100.000 valori => arborele de intervale va avea 2*100.000-1 noduri
// pentru a fi complet, alegem ca dimensiune cel mai mic numar putere a lui 2 care e mai mare decat nr. de noduri
int tree[300000];
int n, m, val, l, r, opt, q;

// valoarea pe care o introduc = val, intervalul pe care fac update = [l, l]
// left = cel mai mic numar din interval, right = cel mai mare
inline void insert(int rad, int left, int right) {
	if(right == left) {
		tree[rad] = val;
		return;
	}
	int m = (left + right) / 2;
	if(l <= m) {
		insert(2*rad, left, m);
	} else {
		insert(2*rad+1, m+1, right);
	}
	if(tree[2*rad] > tree[2*rad+1]) tree[rad] = tree[2*rad];
	else tree[rad] = tree[2*rad+1];
}

// a, b = capetele intervalului; se cauta maximul din intervalul [l, r]
inline void query(int rad, int a, int b) {
	if(l <= a && b <= r) {
		if(tree[rad] > q) {
			q = tree[rad];
		}
		return;
	}
	int m = (a + b) / 2;
	if(l <= m) {
		query(2*rad, a, m);
	}
	if(r > m) {
		query(2*rad+1, m+1, b);
	}
}

int main() {
	fin >> n >> m;
	int i;
	for(i = 1; i <= n; i++) {
		fin >> val;
		l = i;
		insert(1, 1, n);
	}
	for(i = 1; i <= m; i++) {
		fin >> opt;

		if(opt == 0) {
			fin >> l >> r;
			q = 0;
			query(1, 1, n);
			fout << q << "\n";
		} else {
			fin >> l >> val;
			insert(1, 1, n);
		}
	}
	fin.close();
	fout.close();
	return 0;
}