Cod sursa(job #209272)

Utilizator blasterzMircea Dima blasterz Data 21 septembrie 2008 18:08:16
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <cstdio>
#define DIM 8192
#define N 100001
#define common \
	int m=(l+r)>>1, L=n<<1, R=L+1
	
char ax[DIM];
int pz;

inline void cit(int &x)
{
	x=0;
	while(ax[pz]<'0' || ax[pz]>'9')
		if(++pz==DIM)fread(ax, 1, DIM, stdin), pz=0;
	while(ax[pz]>='0' && ax[pz]<='9')
	{
		x=x*10+ax[pz]-'0';
		if(++pz==DIM)fread(ax, 1, DIM, stdin),pz=0;
	}
}

inline void scrie(int x)
{
	char lin[30], *s;
	s=lin+29;s[0]=0;
	int cat;
	do
	{
		cat=x/10;
		--s;
		s[0]=x-cat*10+'0';
		x=cat;
	}while(x);
	puts(s);
}

inline int max(int a, int b)
{
	if(a<b) return b; return a;
}

int H[3*N], a[N], n,m;




inline void build(int n, int l, int r)
{
	if(l==r) { H[n]=a[l]; return;}
	
	common;
	
	build(L, l, m); build(R, m+1, r);
	
	H[n]=max(H[L], H[R]);
}


inline void update(int n, int l,int r, int p, int v)
{
	if(l==r) { H[n]=v;return;}
	
	common;
	
	if(p <= m) update(L, l, m, p, v);
	else       update(R, m+1, r, p, v);
	
	H[n]=max(H[L], H[R]);
}

inline int query(int n, int l, int r, int ql, int qr)
{
	if(ql <= l && r <= qr) return H[n];
	
	common;
	int v=0;
	if(ql <= m) v=max(v, query(L, l, m, ql, qr));
	if(qr > m)  v=max(v, query(R, m+1, r, ql, qr));
	
	return v;
}

int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	cit(n);cit(m);
	int i;
	for(i=1;i<=n;++i) cit(a[i]);
	build(1, 1, n);
	
	int t, p, q;
	while(m--)
	{
		cit(t);cit(p);cit(q);
		
		if(t) update(1, 1, n, p, q);
		else scrie(query(1, 1, n, p, q));
	}
	return 0;
}