Cod sursa(job #1198650)

Utilizator howsiweiHow Si Wei howsiwei Data 16 iunie 2014 15:43:14
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

class BIT2
{
	int n;
	vector<int> t1, t2;
public:
	BIT2(const vector<int> & a)
	{
		n = a.size();
		t1.resize(n+1);
		t2.resize(n+1);
		copy(a.begin(), a.end(), t1.begin()+1);
		for (int stp = 2; stp <= n; stp *= 2) {
			for (int i = stp; i <= n; i += stp) {
				t2[i-stp/2] = t1[i];
				t1[i] = max(t1[i-stp/2], t1[i]);
			}
		}
	}
	int getmax(int lo, int hi)
	{
		int res = 0;
		if (lo != 0) {
			while (lo + (lo & -lo) <= hi) {
				res = max(res, t2[lo]);
				lo += lo & -lo;
			}
		}
		while (hi > lo) {
			res = max(res, t1[hi]);
			hi &= hi-1;
		}
		return res;
	}
	void update(int idx, int val)
	{
		int lo = idx;
		int hi = idx+1;
		while (hi <= n) {
			if ((lo & -lo) > (hi & -hi) || lo == 0) {
				if (t1[hi] == val) {
					break;
				}
				t1[hi] = val;
				val = max(t1[hi], t2[hi]);
				hi += hi & -hi;
			}
			else {
				if (t2[lo] == val) {
					break;
				}
				t2[lo] = val;
				val = max(t1[lo], t2[lo]);
				lo &= lo-1;
			}
		}
	}
};

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];
	}
	BIT2 bit(a);
	for (int i = 0; i < m; ++i) {
		int op;
		fin >> op;
		if (op == 0) {
			int lo, hi;
			fin >> lo >> hi;
			fout << bit.getmax(lo-1, hi) << '\n';
		}
		else {
			int idx, val;
			fin >> idx >> val;
			bit.update(idx-1, val);
		}
	}
	return 0;
}