Cod sursa(job #291362)

Utilizator otilia_sOtilia Stretcu otilia_s Data 29 martie 2009 18:28:44
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>
#include <string.h>
#define NMAX 100008
int v[NMAX];
int m[NMAX*2+1];

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

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

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

int main()
{
 FILE *fin=fopen("arbint.in","r");
 FILE *fout=fopen("arbint.out","w");
int n,i,ev;
 fscanf(fin,"%d %d",&n,&ev);
 for (i=1;i<=n;i++) fscanf(fin,"%d",&v[i]);
// int Na=2*n+1;
 memset (m,0,sizeof(m));
 for (i=1;i<=n;i++)
  schimba(1,i,v[i],1,n);
 int a,b,tip;
 while (ev--)
  {
   fscanf(fin,"%d %d %d",&tip,&a,&b);
   if (tip==0) fprintf(fout,"%d\n",maxim(1,a,b,1,n));
      else schimba(1,a,b,1,n);
  }
 fclose(fin); fclose(fout);
 return 0;
}