Cod sursa(job #209152)

Utilizator yoyolichIoana Ardeleanu yoyolich Data 20 septembrie 2008 23:26:28
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<stdio.h>
#define maxim -1
FILE *f=fopen("arbint.in","r"), *g=fopen("arbint.out","w");
int H[4*100001+66],i,ii,jj,q,poz,val,n,m,j,x;

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

void update(int n, int l, int r, int poz, int val)
{
	if(l==r) {H[n]=val; return;}
	else
	{
		int m=(l+r)>>1, L=n<<1, R=L+1;
		if(poz<=m) update(L, l, m, poz, val);
		else update(R, m+1, r, poz, val);
		H[n]=max(H[L],H[R]);
	}
	
}

inline int query(int n, int l, int r, int ii, int jj)
{
	if(l==r) return H[n];
	else
	{
		int m=(l+r)>>1, L=n<<1, R=L+1, sol=maxim;
		if(ii<=m) sol=max(sol, query(L,l,m,ii,jj));
		if(m<jj) sol=max(sol, query(R, m+1,r, ii,jj));
		return sol;
	}
}

int main()
{
	fscanf(f,"%d %d",&n,&m);
	for(i=1;i<=n;i++)
	{
		fscanf(f,"%d",&x);
		update(1,1,n,i,x);
	}
	
	for(j=1;j<=m;j++)
	{
		fscanf(f,"%d",&q);
		if(q==0)
		{
			fscanf(f,"%d %d",&ii,&jj);
			fprintf(g,"%d\n",query(1,1,n,ii,jj));
			
		}
		else
		{
			fscanf(f,"%d %d",&poz,&val);
			update(1,1,n,poz,val);
		}
	}
	
	fclose(f);
	fclose(g);
	return 0;
}