Cod sursa(job #1152053)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 24 martie 2014 15:28:41
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <cstdio>

using namespace std;

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

int n,m,x,v[1000005];
int a,b,q, poz;
inline int max (int a,int b) {
	if (a>b)
		return a;
	return b;
}

int query (int nod,int st, int dr) {
	
	int qs=-1,qd=-1;
	if (a<=st && b>=dr) 
		return v[nod];
	int fiu=(nod<<1);
	int mid=(st+dr)>>1;
	if (a<=mid)
		qs=query(fiu,st,mid);
	if (b>mid)
		qd=query((fiu)+1,mid+1,dr);
	
	return max(qs,qd);
}

void update (int nod, int st, int dr) {
	
	if (st==dr && st==poz) {
		v[nod]=b;
		return;
	}
	int fiu=(nod<<1);
	int mid=(st+dr)>>1;
	if (poz<=mid)
		update(fiu,st,mid);
	else 
		if (poz>mid)
			update(fiu+1,mid+1,dr);
	v[nod]=max(v[fiu],v[fiu+1]);
}

int main () {
	
	register int i;
	freopen("arbint.in","r",stdin);
	//fin>>n>>q;
	scanf("%d%d",&n,&q);
	for (i=1;i<=n;i++) {
		//fin>>x;
		scanf("%d",&x);
		poz=i;
		b=x;
		update(1,1,n);
	}
	while (q--) {
		//fin>>x>>a>>b;
		scanf("%d%d%d",&x,&a,&b);
		if (x==0) 
			fout<<query(1,1,n)<<"\n";
		else{
			poz=a; 
			update(1,1,n);
		}
	}
	
	return 0;
}