Cod sursa(job #627215)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 29 octombrie 2011 12:29:42
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<fstream>
#include<iostream>
using namespace std;
int n,m,a[400200],val,poz,c,d,maxim;
inline int max(int a,int b) {if(a>b) return a;return b;}
void query(int nod,int left,int right) {
	if(c<=left&&right<=d) {
		maxim=max(maxim,a[nod]);
		return;
		}
	int mij=(left+right)/2;
	if(c<=mij) query(2*nod,left,mij);
	if(d>mij) query(2*nod+1,mij+1,right);
}
void update(int nod,int left,int right) {
	if(left==right) {
		a[nod]=val;
		return;
		}
	int mij=(left+right)/2;
	if(poz<=mij)	update(2*nod,left,mij);
	else			update(2*nod+1,mij+1,right);
	a[nod]=max(a[2*nod],a[2*nod+1]);	
}
int main() {
	int i,w,x,y;
	long long clo=clock();
	ifstream in("arbint.in");
	ofstream out("arbint.out");
	in>>n>>m;
	for(i=0;i<n;i++) {
		in>>val;
		poz=i;
		update(1,0,n-1);
		}
	for(i=0;i<m;i++) {
		in>>w>>x>>y;
		if(w==1) {
			val=y;
			poz=x-1;
			update(1,0,n-1);
			}
		else {
			maxim=-1;
			c=x-1;
			d=y-1;
			query(1,0,n-1);
			out<<maxim<<'\n';
			}
		}
	cout<<clock()-clo;
	out.close();
	in.close();
	return 0;
}