Nu aveti permisiuni pentru a descarca fisierul grader_test1.in

Cod sursa(job #152392)

Utilizator crawlerPuni Andrei Paul crawler Data 9 martie 2008 13:51:20
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 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;               
#define Q W W W W W W W W W W W W W W W W
#define UPDATE i=(i/KKK)*KKK; Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q 
#define T if (i&XXX == 0 && i+KKK <= b) { if (ret < MAX[i/KKK]) ret = MAX[i/KKK]; i+=KKK; } else if (ret < t[i] && i<=b) ret = t[i];  ++i;              
#define R T T T T T T T T T T T T T T T T T T T T T T
#define E R R R R R R R R R R R R R R R R R R R R R R

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;
        UPDATE
     }
     
}

int search(int a,int b)
{
     int ret=-1;
     for (int i=a;i<=b;)
     {
      E
     }
     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;
}