Cod sursa(job #200917)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 27 iulie 2008 14:01:41
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <stdio.h>   

#define NMAX 401000

int n,m;
int arbore[NMAX];
int v,p,maxim,f,s;

int max(int a,int b)
{
if (a>b) return a;
   else  return b;
}

void interogare(int nod,int st,int dr)
{
int mij;
if (st==dr)
{
arbore[nod]=v;
return;
}
mij=(st+dr)/2;
if (p<=mij) interogare(2*nod,st,mij);
     else     interogare(2*nod+1,mij+1,dr);
arbore[nod]=max(arbore[2*nod],arbore[2*nod+1]);
}


void actualizare(int nod,int st,int dr)
{
int mij;
if (s<=st && dr<=f)
{
if (maxim<arbore[nod])
   maxim=arbore[nod];
return;
}
mij=(st+dr)/2;
if (s<=mij) actualizare(2*nod,st,mij);
if (mij<f) actualizare(2*nod+1,mij+1,dr);
}


int main()
{
int i,a,b,x;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
    for (i=1;i<=n;++i){   
        scanf("%d",&x);   
	p=i;
	v=x;
	interogare(1,1,n);
    }   
    while (m--)
    {
    scanf("%d%d%d",&x,&a,&b);
    if (x==0)
       {
	  maxim=-1;
	  s=a;
	  f=b;
	  actualizare(1,1,n);
	  printf("%d\n",maxim);
	  }
	  else
	  {
	       p=a;
	       v=b;
	       interogare(1,1,n);
	  }
    }
return 0;
}