Cod sursa(job #291414)

Utilizator otilia_sOtilia Stretcu otilia_s Data 29 martie 2009 19:57:44
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <stdio.h>
#include <string.h>
#define NMAX 100008
int m[NMAX*5+1];
int poz, val,a,b,MAX;

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

void schimba (int nod,int st, int dr)
{
 if (st==dr) m[nod]=val;
    else
     {
       int mij=(st+dr)/2;
       if (poz<=mij) schimba(2*nod,st,mij);
	  else schimba(2*nod+1,mij+1,dr);
       m[nod]=max(m[2*nod],m[2*nod+1]);
     }
}

void maxim(int nod, int st, int dr)
{
 if (a<=st && b>=dr) {
		      if (MAX<m[nod])MAX=m[nod];
		     }
    else
     {
      int mij=(st+dr)/2;
      if (a<=mij) maxim(2*nod,st,mij);
      if (b>mij) maxim(2*nod+1,mij+1,dr);
     }
}

int main()
{
 FILE *fin=fopen("arbint.in","r");
 FILE *fout=fopen("arbint.out","w");
int n,i,ev;
 memset (m,0,sizeof(m));
 fscanf(fin,"%d %d",&n,&ev);
 for (i=1;i<=n;i++)
  {
   fscanf(fin,"%d",&val);
   poz=i;
   schimba(1,1,n);
  }

int tip;
 while (ev--)
  {
   fscanf(fin,"%d %d %d",&tip,&a,&b);
   if (tip==0)
	{
	 MAX=-1;
	 maxim(1,1,n);
	 fprintf(fout,"%d\n",MAX);
	}
      else
	{ val=b; poz=a;
	  schimba(1,1,n);
	}
  }
 fclose(fin); fclose(fout);
 return 0;
}