Cod sursa(job #181138)

Utilizator znakeuJurba Andrei znakeu Data 17 aprilie 2008 21:43:34
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <stdio.h>
#define MAXN 100100
#define MAXA 300000

int v[MAXN],n,m,K,ST=0,DR=0;
int A[MAXA];

inline int max(int x, int y)
{
	if (x>y)
		return x;
	return y;
}

void actualizare(int pozc,int st,int dr)
{
	if (ST<=st && DR>=dr)
	{
		A[pozc]=K;
		return;
	}
	
	int ma=(st+dr)/2;
	if (ST<=ma)
		actualizare(2*pozc,st,ma);
	if (DR>ma) 
		actualizare(2*pozc+1,ma+1,dr);
	A[pozc]=max(A[2*pozc],A[2*pozc+1]);
}

void interogare(int pozc,int st,int dr)
{
	if (ST<=st && DR>=dr)
	{
		K=max(K,A[pozc]);
		return;
	}
	
	int ma=(st+dr)/2;
	if (ST<=ma)
		interogare(2*pozc,st,ma);
	if (DR>ma) 
		interogare(2*pozc+1,ma+1,dr);
}


void citire()
{
	char s1[MAXN*16]; int i,j;
	
	fgets(s1,4*16,stdin);
	
	j=0; n=0; m=0;
	
	while (s1[j]>='0' && s1[j]<='9')
		n=n*10+s1[j++]-'0';
	
	j++;
	
	while (s1[j]>='0' && s1[j]<='9')
		m=m*10+s1[j++]-'0';
	
	fgets(s1,16*MAXN,stdin);
	
	for (i=0,j=0; i<n; i++,j++)
	{
		K=0;
		while (s1[j]>='0' && s1[j]<='9')
			K=K*10+s1[j++]-'0';
		v[i]=K;	ST=DR=i;
		actualizare(1,0,n-1);
	}
}

void rezolvare()
{
	char s1[4*16];
	int t,a,b,i,j;
	
	
	for (i=0; i<m; i++)
	{
		fgets(s1,4*16,stdin);
		
		j=0; t=0; a=0; b=0;
		
		while (s1[j]>='0' && s1[j]<='9')
			t=t*10+s1[j++]-'0';
		
		j++;
		
		while (s1[j]>='0' && s1[j]<='9')
			a=a*10+s1[j++]-'0';
		
		j++;
		
		while (s1[j]>='0' && s1[j]<='9')
			b=b*10+s1[j++]-'0';
		
		if (t==1)
		{
			K=b; a--; ST=DR=a;
			actualizare(1,0,n-1);			
		}
		
		if (t==0)
		{
			a--; b--; ST=a; DR=b; K=0;
			interogare(1,0,n-1);
			printf("%d\n",K);
		}
	}	
}


int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	
	
	citire();
	rezolvare();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}