Cod sursa(job #144060)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 27 februarie 2008 10:03:47
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<stdio.h>
long int n,m,baza,i,a[262150],b[262150],s[262150],last,fs,fd,x,y,z,poz,tata,
maxold,maxnew;
long int query(long int pa);
int main()
{
	FILE *f,*g;
	f=fopen("arbint.in","r");
	g=fopen("arbint.out","w");
	fscanf(f,"%ld%ld",&n,&m);
	baza=1;
	while(baza<n)baza<<=1;
	baza--;
	i=1;
	for(i=1;i<=n;i++)
	{ a[baza+i]=i;
	  b[baza+i]=i;
	  fscanf(f,"%ld",&s[baza+i]);
	}
	for(i=n+1;i<=baza+1;i++)
	{ a[baza+i]=i;
	  b[baza+i]=i;
	}
	for(i=baza;i>=1;i--)
	{ fs=(i<<1);
	  fd=fs+1;
	  a[i]=a[fs];
	  b[i]=b[fd];
	  s[i]=(s[fs]>s[fd])?s[fs]:s[fd];
	}
	for(i=1;i<=m;i++)
	{ fscanf(f,"%ld%ld%ld",&x,&y,&z);
	  if(x==0)
	   fprintf(g,"%ld\n",query(1));
	  else
	  {  poz=baza+y;
	     s[poz]=z;
	     tata=poz>>1;
	     while(tata)
	      { fs=tata<<1;
		fd=fs+1;
		maxold=s[tata];
		maxnew=(s[fs]>s[fd])?s[fs]:s[fd];
		if(maxnew==maxold)break;
		s[tata]=maxnew;
		tata>>=1;
	      }
	  }
	}
	fcloseall();
	return 0;
}
long int query(long int pa)
{       long int max1,max2;
	if(y>b[pa])return 0;
	if(z<a[pa])return 0;
	if(y<=a[pa]&&b[pa]<=z) return s[pa];
	max1=query(pa<<1);
	max2=query((pa<<1)|1);
	max1=(max1>max2)?max1:max2;
	return max1;
}