Cod sursa(job #1287566)

Utilizator catalincraciunCraciun Catalin catalincraciun Data 7 decembrie 2014 20:52:10
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
/// Craciun Catalin
///  Arbint
#include <iostream>
#include <fstream>

#define NMax 100005

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int n, m;
int newV;
int pos;
int maxi;
int ARB[2*NMax];
int start, finish;

inline int maxim (int a, int b) { return (a > b)?a:b; };

void query(int nod, int left, int right) {

	if (start <= left && right <= finish) {
		maxi = maxim(maxi, ARB[nod]);
		return;
	}

	int mij = (left+right)/2;
	if (start <= mij)
		query(2*nod, left, mij);
	if (mij < finish)
		query(2*nod+1, mij+1, right);
}

void update(int nod, int left, int right) {

	if (left == right) {
		ARB[nod] = newV;
		return;
	}

	int mij = (left + right)/2;
	if (pos <= mij)
		update(2*nod, left, mij);
	else
		update(2*nod+1, mij+1, right);

	ARB[nod] = maxim (ARB[2*nod], ARB[2*nod+1]);
}

void read() {

	f>>n>>m;
	for (int i = 1; i <= n; i++) {
		int x; f>>x;
		pos = i;
		newV = x;
		update(1,1,n);
	}

	for (int i = 1; i <= m; i++) {
		int type; f>>type;

		if (type == 1) {
			f>>pos>>newV;
			update(1,1,n);
		} else {
			f>>start>>finish;
			maxi = -1;
			query(1,1,n); g<<maxi<<'\n';
		}
	}
}

int main() {

	read();

	f.close(); g.close();
	return 0;
}