Cod sursa(job #1842576)

Utilizator tonisnakesBoar Antonio tonisnakes Data 7 ianuarie 2017 11:29:21
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <fstream>
#define NMAX 100005
using namespace std;

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

int a[NMAX<<2];

void build (int node, int st, int dr) {
	if (st == dr) {
		fin >> a[node];
	}
	else {
		int mid = (st + dr) >> 1;
		build(node*2,st,mid);
		build(node*2+1,mid+1,dr);
		a[node] = max(a[node*2],a[node*2+1]);
	}
}

int query (int node, int st, int dr, int x, int y) {
	if (x <= st && dr <= y) {
		return a[node];
	}
	else {
		int mid = (st + dr) >> 1;
		if (y <= mid) {
			return query(node*2,st,mid,x,y);
		}
		else
		if (x > mid) {
			return query(node*2+1,mid+1,dr,x,y);
		}
		else {
			return max(query(node*2,st,mid,x,y),query(node*2+1,mid+1,dr,x,y));
		}
	}
}

void update (int node, int st, int dr, int poz, int val) {
	if (st == dr) {
		a[node] = val;
	}
	else {
		int mid = (st + dr) >> 1;
		if (poz <= mid) {
			update(node*2,st,mid,poz,val);
		}
		else {
			update(node*2+1,mid+1,dr,poz,val);
		}
		a[node] = max(a[node*2],a[node*2+1]);
	}
}

int main () {
	int n, m;
	fin >> n >> m;
	build(1,1,n);
	int op, x, y;
	//cout << n << m;
	for (int t = 1; t <= m; ++t) {
		fin >> op >> x >> y;
		if (op == 0) {
			fout << query(1,1,n,x,y) << '\n';
		}
		else {
			update(1,1,n,x,y);
		}
	}
	
	return 0;
}