Cod sursa(job #494348)

Utilizator szabibibiOrban Szabolcs szabibibi Data 21 octombrie 2010 12:44:06
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.34 kb
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

#define Nmax 1001
#define Mmax 1001

typedef struct arbint
{
        long e,v;
        long max,maxi;
        struct arbint *k,*n;
} arbint;

long A[Nmax];
arbint l;
long n,m,c,a,b,i,val,vali;

long MAX(arbint *a, arbint *b, long *m)
{
     if (a->max > b->max)
     {
        *m = a->maxi;
        return a->max;
     }
     else
     {
         *m = b->maxi;
         return b->max;
     }
}


void initfa(arbint *l, long e, long v)
{
     l->e = e;
     l->v = v;

     if (e!=v)
     {
        l->n = new arbint;
        l->k = new arbint;
		initfa(l->k,e,(e+v)/2);
        initfa(l->n,(e+v)/2+1, v);
        l->max = MAX(l->k,l->n,&l->maxi);
     }
     else
     {
         l->k = NULL;
         l->n = NULL;
         l->max = A[e];
         l->maxi = e;
     }
}

long maxkeres(arbint *l, long a, long b, long *c)
{
     long e,k,v,m1,m2,mm1,mm2;
     e = l->e;
     v = l->v;
     k = (e+v)/2;
     if ((a<e)||(b>v) || (b<a))
        return LONG_MIN;
     else if ((a>k)&&(b>k))
        return maxkeres(l->n,a,b,c);
     else if ((a<k) && (b<=k))
        return maxkeres(l->k,a,b,c);
     else if ((a==e)&&(b==v))
     {

        *c = l->maxi;
        return l->max;
     }
     else if ((a<=k) && (b>k))
     {
          m1 = maxkeres(l->k,a,k,&mm1);
          m2 = maxkeres(l->n,k+1,b,&mm2);
          if (m1>m2)
          {
			 *c = mm1;
			 return m1;
		  }
		  else
		  {
			  *c = mm2;
			  return m2;
		  }
	 }
	 return 0;
}

void szabadit(arbint *l)
{
	if (l->k!=NULL)
	{
		szabadit(l->k);
		delete(l->k);
	}
	if (l->n!=NULL)
	{
		szabadit(l->n);
		delete(l->n);
	}
	return;
}

void igazit(arbint *l, long c, long d)
{
    long m1,m2,m,mm,mm1,mm2,e,v,k;
    m1 = maxkeres(l,l->e,c-1,&mm1);
    m2 = maxkeres(l,c+1,l->v,&mm2);
    if (m1>m2)
    {
        m = m1;
        mm = mm1;
    }
    else
    {
        m = m2;
        mm = mm2;
    }
    if (m>d)
    {
       l->max = m;
       l->maxi = mm;
    }
    else
    {
        l->max = d;
        l->maxi = c;
    }
    e = l->e;
    v = l->v;
    k = (e+v)/2;
    if (e!=v)
    {
    if (c>k)
    {
        igazit(l->n,c,d);
    }
    else
    {
        igazit(l->k,c,d);
    }
    }
    return;
}

void modif(arbint *l,long c,long d)
{
    long m,m1,m2,mm,mm1,mm2,e,v,k;
    A[c] = d;
    m1 = maxkeres(l,l->e,c-1,&mm1);
    m2 = maxkeres(l,c+1,l->v,&mm2);
    if (m1>m2)
    {
        m = m1;
        mm = mm1;
    }
    else
    {
        m = m2;
        mm = mm2;
    }
    if (d > m)
    {
        l->max = d;
        l->maxi = c;
    }
    else
    {
        l->max = m;
        l->maxi = mm;
    }
    e = l->e;
    v = l->v;
    k = (e+v)/2;
    if (c>k)
    {
        igazit(l->n, c, d);
    }
    else
    {
        igazit(l->k, c, d);
    }
    return;
}

int main()
{

	FILE *g = fopen("arbint.out","w");
	freopen("arbint.in","r",stdin);


	scanf("%ld %ld",&n,&m);
	for (i = 1;i<=n;i++)
		scanf("%ld",&A[i]);
	initfa(&l,1,n);

	for (i = 1;i<=m;i++)
	{
		scanf("%ld %ld %ld",&c,&a,&b);
		if (!c)
		{
		   val = maxkeres(&l,a,b,&vali);
		   fprintf(g,"%ld\n", val);
		}
		else
		{
		   modif(&l,a,b);
		}
	}
	szabadit(&l);
    fclose(g);
    return 0;
}