Cod sursa(job #591466)

Utilizator deneoAdrian Craciun deneo Data 24 mai 2011 12:21:13
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include<cstdio>
#include<algorithm>
using namespace std;

int a[500000], n, m;

/*void update(int node, int left, int right, int i, int v) {
	if(left >= right) { a[node] = v; return; }
	
	int mid = (left + right) / 2;
	if(i <= mid) update(node * 2, left, mid, i, v);
	else update(node * 2 + 1, mid + 1, right, i, v);
	a[node] = max(a[node], v);
}

int query(int node, int left, int right, int st, int fn) {
	if(left >= right) return a[node];
	int mid = (left + right) / 2, sol = 0;
	if(st <= mid) sol = max(sol, query(node * 2, left, mid, st, mid));
	if(fn >= mid) sol = max(sol, query(node * 2 + 1, mid + 1, right, mid + 1, fn));
	return sol;
}*/

inline void update(int node, int left, int right, int i, int v)
{
    if(left>=right) {a[node]=v; return;}
    int middle=(left+right)/2; 
    if(i<=middle)  update(2*node, left, middle, i, v);
            else  update(2*node+1, middle+1, right, i, v);
    a[node]=max(a[2*node], a[2*node+1]);
}

inline int query(int node, int left, int right, int i, int j)
{
    if(i<=left && right<=j) return a[node];
    int middle=(left+right)/2, sol=0;
    if(i<=middle) sol=max(sol,query(2*node, left, middle, i,j));
    if(j>middle) sol=max(sol,query(2*node+1, middle+1,right, i, j));
return sol;
}

int main() { 
	int i, st, fn, t;
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	scanf("%d%d", &n, &m);
	for(i = 1; i <= n; ++i) {
		scanf("%d", &t);
		update(1, 1, n, i, t);
	}
	while(m--) { 
		scanf("%d%d%d", &t, &st, &fn);
		if(t == 0)
			printf("%d\n", query(1, 1, n, st, fn));
		else update(1, 1, n, st, fn);
	}
	return 0;
}