Cod sursa(job #189144)

Utilizator za_wolfpalianos cristian za_wolf Data 12 mai 2008 13:06:25
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<stdio.h>
#define NMAX 100010
int q,c,m1,m2,x[NMAX],a[NMAX*2+1],rez,i,j,n,m,k,l,b,s,t;
int max(int a,int b)
{
 	if (a>b)
      	return a;
   	return b;
}
int start(int k,int s,int t)
{
	if (s==t)
    {
     	a[k]=x[s];
        return x[s];
    }
	m1=start(2*k,s,(s+t)/2);
    m2=start(2*k+1,(s+t)/2+1,t);
    a[k]=max(m1,m2);
}
void modify(int k,int s,int t)
{
 	if (s==t)
    {
    	a[k]=c;
        return ;
    }
	int q=(s+t)/2;
	if (b<=q)
      	modify(2*k,s,q);
    else
     	modify(2*k+1,q+1,t);
   	a[k]=max(a[2*k],a[2*k+1]);
}

void query(int k,int s,int t)
{
    if (s>=b&&t<=c)
    {
        if (rez<a[k])
	        rez=a[k];
      	return;
  	}
	int q=(s+t)/2;
    if (b<=q)
      	query(2*k,s,q);
	if (q<c)
      	query(2*k+1,q+1,t);
}

int main()
{
 	freopen("arbint.in","r",stdin);
 	freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (i=1;i<=n;i++)
       	scanf("%d",&x[i]);
    a[1]=start(1,1,n);
    for (i=1;i<=m;i++)
    {
     	scanf("%d%d%d",&k,&b,&c);
        if (k==1)
          	modify(1,1,n);
        else
        {
         	rez=-1;
        	query(1,1,n);
            printf("%d\n",rez);
        }
    }

    return 0;
}