Cod sursa(job #1225570)

Utilizator andreas.chelsauAndreas Chelsau andreas.chelsau Data 2 septembrie 2014 21:36:43
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

int arb[(100000 << 2)],val,a,b,res;

void update(int node,int l,int r){
	if(l == r)
		arb[node] = val;
	
	else{
		int mid = l + ((r - l) >> 1);
		if(a <= mid)
			update((node << 1), l, mid);
		if(mid < b)
			update((node << 1) + 1, mid + 1, r);	
		 arb[node] = max(arb[(node << 1) + 1],arb[(node << 1)]);
	}
}

void query(int node,int l,int r){
	if(a <= l && b >= r){
		res = max(res,arb[node]);
	}
	else{
		int mid = l + ((r - l) >> 1);
		if(a <= mid)
			query((node << 1), l, mid);
		if(mid < b)
			query((node << 1) + 1, mid + 1, r);
	}
}
int main(){
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	int v,n,m;
	scanf("%d%d",&n,&m);
	for(int i = 1; i <= n; i++){
		scanf("%d",&v);
		val = v;
		a = i;
		b = a;
		update(1,1,n);
	}
	for(int i = 0; i < m; i++){
		int cmd,begin,end;
		scanf("%d%d%d",&cmd,&begin,&end);
		if(cmd == 1){
			a = begin;
			b = a;
			val = end;
			update(1,1,n);
		}
		else{
			res = 0;
			a = begin,b = end;
			query(1,1,n);
			printf("%d\n",res);
		}

	}
	return 0;
}