Cod sursa(job #942096)

Utilizator howsiweiHow Si Wei howsiwei Data 20 aprilie 2013 19:01:40
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

class SegTree {
public:
	SegTree( vector<int> a ) {
		n = a.size();
		for (size = 1; size < n; size *= 2);
		seg.resize(2*size);
		
		for (int i = 0; i < size; ++i) {
			seg[size+i] = (i < n ? a[i] : 0);
		}
		for (int i = size-1; i > 0; --i) {
			seg[i] = max( seg[2*i], seg[2*i+1] );
		}
	}

	void update( int idx, int val ) {
		idx += size;
		seg[idx] = val;
		for (idx /= 2; idx >= 1; idx /= 2) {
			seg[idx] = max( seg[2*idx], seg[2*idx+1] );
		}
	}

	int getmax( int lo, int hi ) {
		lo += size;
		hi += size;
		int ret = 0;
		while (lo <= hi) {
			ret = max( ret, max( seg[lo], seg[hi] ) );
			lo = (lo%2 == 0 ? lo/2 : lo/2+1);
			hi = (hi%2 == 1 ? hi/2 : hi/2-1);
		}
		return ret;
	}

	vector<int> seg;
	int size;
	int n;
};

int main() {
	ifstream fin("arbint.in");
	ofstream fout("arbint.out");
	int n, m;
	fin >> n >> m;
	vector<int> a(n);
	for (int i = 0; i < n; ++i) {
		fin >> a[i];
	}

	SegTree seg(a);

	for (int i = 0; i < m; ++i) {
		int op;
		fin >> op;
		if (op == 0) {
			int lo, hi;
			fin >> lo >> hi;
			fout << seg.getmax(--lo, --hi) << '\n';
		}
		else {
			int idx, val;
			fin >> idx >> val;
			seg.update(--idx, val);
		}
	}

	return 0;
}