Nu aveti permisiuni pentru a descarca fisierul grader_test6.ok

Cod sursa(job #152380)

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

#define Nmax 111111
#define KKK 256
#define XXX KKK-1

#define W if (t[i] > MAX[i/KKK]) MAX[i/KKK] = t[i]; ++i;               

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

void update(int i,int x)
{    
     if (t[i]^MAX[i/KKK])
     {
         t[i] = x;
         if (t[i] > MAX[i/KKK]) MAX[i/KKK] = t[i];    
     }
         else
     {
        t[i] = x;MAX[i/KKK]=-1;
        for (i=(i/KKK)*KKK;i&XXX;) 
        {
            W W W W W W W W
        }

     }
     
}

int search(int a,int b)
{
     int ret=-1;
     for (int i=a;i<=b;)
     {
          while (i&XXX == 0 && i+KKK <= b)
          {
               if (ret < MAX[i/KKK]) ret = MAX[i/KKK];
               i+=KKK;              
          }
          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=1,a,b;

	for (i=0;i<n;++i)
	{
		scanf("%d", &t[i]);
		if (MAX[i/KKK] < t[i]) MAX[i/KKK] = t[i];
	}

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

	return 0;
}