Cod sursa(job #997889)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 15 septembrie 2013 01:09:45
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <fstream>
using namespace std;

const string file = "arbint";

const string infile = file + ".in";
const string outfile = file + ".out";

const int INF = 0x3f3f3f3f;
int N, M;


class SegmentMax
{
public:

	SegmentMax(int size)
	{
		int c = 1;
		for(;c < size; c <<= 1);
		c <<= 1;
		this->_data.resize(c + 1);
		this->_size = size;
	}

	void Update(int nod, int a, int b, int st, int dr, int v)
	{
		if(a <= st && dr <= b)
		{
			_data[nod] = v;
			return;
		}
		int mid = (st + dr) / 2;

		if( a <= mid)
			Update(nod * 2, a, b, st, mid, v);
		if(mid < b)
			Update(nod * 2 + 1, a, b, mid + 1, dr, v);

		_data[nod] = max(_data[nod*2], _data[nod*2+1]);
	}

	int Query(int nod, int a, int b, int st, int dr)
	{
		if(a <= st && dr <= b)
		{
			return _data[nod];
		}
		int mid = (st + dr) / 2;

		int r;
		if( a <= mid)
			r = Query(nod * 2, a, b, st, mid);
		if(mid < b)
			r = max(r, Query(nod * 2 + 1, a, b, mid + 1, dr));
		return r;
	}
protected:
private:
	vector<int> _data;
	int _size;
};



int main()
{
	fstream fout(outfile.c_str(), ios::out);
	fstream fin(infile.c_str(), ios::in);


	fin >> N >> M;
	SegmentMax seg(N);

	for(int i = 0; i < N; i++)
	{
		int x;
		fin >> x;
		seg.Update(1, i + 1, i + 1, 1, N, x);
	}


	for(int i = 0; i < M; i++)
	{
		int op, a, b;
		fin >> op >> a >> b;
		if(op == 0)
		{
			fout << seg.Query(1, a, b, 1, N) << "\n";
		}
		else if(op == 1)
		{
			seg.Update(1, a, a, 1, N, b);
		}
	}

	fin.close();
	fout.close();
}