Cod sursa(job #152119)

Utilizator crawlerPuni Andrei Paul crawler Data 9 martie 2008 01:22:11
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <stdio.h>

#define Nmax 111111
#define KKK 4096
#define XXX 4095

int t[Nmax], n,m, MAX[Nmax/KKK];

int max(int A,int B)
{
	if (A>B) return A;
	return B;
}

void update(int i,int x)
{    
     int a=i/KKK;
     if(i&XXX)++a;
     if (MAX[a]<=x) { MAX[a] = x;t[i]=x; }
     {
        t[i] = x;MAX[a]=-1;
        int b,c;b=(a-1)*KKK+1;c=a*KKK;
        for (int i=b;i<=c;++i) if (t[i] > MAX[a]) MAX[a] = t[i];               
     }
}

int search(int a,int b)
{
     int ret=-1;
     for (int i=a;i<=b;)
     if (i&XXX == 0 && i+KKK <= b)
     {
               if (ret < t[i]) ret = t[i]; ++i;                             
               if (ret < MAX[i/KKK+1]) ret = MAX[i/KKK+1];
               i+=KKK;              
     }
      else
     {
               if (ret < t[i]) ret = t[i];
               ++i;              
     }
     return ret;
}

int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);

	scanf("%d%d", &n,&m);

	int i,x,a,b;

	for (i=1;i<=n;++i)
	{
		scanf("%d", &x);
		update(i,x);
	}

	for (i=1;i<=m;++i)
	{
		scanf("%d%d%d", &x,&a,&b);
		if (x==0)
		printf("%d\n", search(a,b));
		else update(a,b);
	}

	return 0;
}