Cod sursa(job #155137)

Utilizator rethosPaicu Alexandru rethos Data 11 martie 2008 19:17:52
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <stdio.h>
#define NM 100001
long arb[4*NM+100];
long m,n;
long query(long st,long dr,long x,long y,long nod );
void update(long st,long dr,long poz,long a,long nod);
int main()
{ freopen("arbint.in","rt",stdin);
  freopen("arbint.out","wt",stdout);
  scanf("%ld %ld",&n,&m);
  long i,x,a,b,max;
  for (i=1;i<=n;i++)
	{ scanf("%ld",&x);
	  update(1,n,i,x,1);
	}
  for (i=1;i<=m;i++)
	{ scanf("%ld %ld %ld",&x,&a,&b);
	  if (x==0)
		{ max=query(1,n,a,b,1);
		  printf("%ld\n",max);
		}
	  else    update(1,n,a,b,1);

	}
  return 0;
}
long query(long st,long dr,long x,long y,long nod)
{ if (st>y||dr<x) return -1;
  if (x<=st&&dr<=y) return arb[nod];
  long mij=(st+dr)/2,x1=-1,x2=-1;
  x1=query(st,mij,x,y,2*nod);
  x2=query(mij+1,dr,x,y,2*nod+1);
  return (x1>x2?x1:x2);
}
void update(long st,long dr,long poz,long a,long nod)
{ if (st==dr)
	{ arb[nod]=a;
	  return;
	}
  long mij=(st+dr)/2;
  if (poz<=mij) update(st,mij,poz,a,2*nod);
	else update(mij+1,dr,poz,a,2*nod+1);
  arb[nod]=(arb[2*nod]>arb[2*nod+1]?arb[2*nod]:arb[2*nod+1]);
}