Cod sursa(job #1200945)

Utilizator tudi98Cozma Tudor tudi98 Data 23 iunie 2014 22:02:07
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>
using namespace std;
#define dim 200005

struct nod{int l,r;};
typedef nod Tree[dim*2];

Tree T;
int v[100005];

inline int left_son(int k){
	return k<<1;
}

inline int right_son(int k){
	return (k<<1)+1;
}

void build_tree(int x,int y,int i,Tree& T){
	int mid=(x+y)/2;
	T[i].l=x;
	T[i].r=y;
	if(x<y){
		build_tree(x,mid,left_son(i),T);
		build_tree(mid+1,y,right_son(i),T); 
	}
}

int query(int a,int b,int i,Tree& T){
	if(T[i].l==T[i].r) return v[T[i].l];
	int mid=(T[i].l+T[i].r)/2,rquery=-1,lquery=-1;
	if(a<=mid)
		lquery=query(a,mid,left_son(i),T);
	if(b>mid)
		rquery=query(mid+1,b,right_son(i),T);
	return max(lquery,rquery);	
}

int main(){

	ifstream f("arbint.in");
	ofstream g("arbint.out");
	
	int n,m,a,b;
	bool p;
	f >> n >> m;
	build_tree(1,n,1,T);
	for(int i=1;i<=n;i++){
		f >> v[i];
	}
	while(m--){
		f >> p >> a >> b;
		if(p) v[a]=b;
		else g << query(a,b,1,T) << "\n";		
	}
}