Cod sursa(job #200916)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 27 iulie 2008 13:50:46
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>   
#include <stdlib.h>   
#define NMAX 401000

int n,m;
int arbore[NMAX];
int v,poz,maxim;

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 (poz<=mij)
    interogare(2*nod,st,mij);
     else
      interogare(2*nod+1,mij+1,st);

     arbore[nod]=max(arbore[2*nod],arbore[2*nod+1]);
}


void actualizare(int nod,int st,int dr)
{
int mij,a,b;

if (a<=st && dr<=b)
{
if (maxim<arbore[nod])
    maxim=arbore[nod];
return;
}
mij=(st+dr)/2;
if (a<=mij) actualizare(2*nod,st,mij);
if (mij<b) 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);   
	poz=i;
	v=x;
	interogare(1,1,n);
    }   
    for (i=1;i<=m;i++)
    {
	  scanf("%d %d %d",&x,&a,&b);
	  if (x==0)
	  {
	  maxim=-1;
	  actualizare(1,1,n);
	  printf("%d\n",maxim);
          }   
	  else
	  {
	  poz=a;
	  v=b;
	  interogare(1,1,n);
          }   
    }   
return 0;
}