Cod sursa(job #1718474)

Utilizator TeodorCotetCotet Teodor TeodorCotet Data 17 iunie 2016 22:58:11
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 100002;

int n;

int a[4 * NMAX];

int query(int nod,int st, int dr, int left, int right) {
	
	if(left <= st && dr <= right)
		return a[nod];

	int maxi = 0;
	int mid = (st + dr) / 2;
	//st , mid, dr
	if(left <= mid)
		maxi = query(nod * 2, st, mid, left, right);

	if(mid + 1 <= right)
		maxi = max(maxi, query(nod * 2 + 1 , mid + 1, dr, left , right));

	return maxi;
}

int update(int nod, int n, int st, int dr, int pos, int value) {

	if(st == dr) {
		a[nod] = value;
		return value;
	}

	int mid = (st + dr) / 2;
	int x = 0;
	if(pos <= mid)
		a[nod * 2] = update(nod * 2, n, st, mid, pos, value);
	else 
		a[nod * 2 + 1] = update(nod * 2 + 1, n, mid + 1, dr, pos, value);
	return (a[nod] = max(a[nod * 2], a[nod * 2 + 1]));
}

int main() {

	int type; int m;
	fin >> n >> m;

	for(int i = 1; i <= n ; ++i) {
		int x; fin >> x;
		update(1, n, 1, n, i, x);
	}

	while(m--) {

		int x; int y;
		fin >> type >> x >> y;
		if(type == 0)
			fout << query(1, 1, n, x, y) << '\n'; 
		if(type == 1)
			update(1, n, 1, n, x, y);
	}


}