Cod sursa(job #391693)

Utilizator vicenzo_cnuStan Alexandru Dan vicenzo_cnu Data 6 februarie 2010 03:52:59
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<stdio.h>
#define Nmax 100005
long Maxarb[Nmax*4+66];
int n,m,pos,val,start,fin,maxim;

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

void init(int nod,int left,int right)
{if(left==right)
  {Maxarb[nod]=val;
   return;}
int div=(left+right)/2;
 if(pos<=div) 
   init(2*nod,left,div);
 else 
   init(2*nod+1,div+1,right);
Maxarb[nod]=max(Maxarb[2*nod],Maxarb[2*nod+1]);
}
void inter(int nod,int left,int right)
{if(start<=left && right<=fin)
 {if(maxim<Maxarb[nod]) maxim=Maxarb[nod];
  return;}
int div=(left+right)/2;
if(start<=div) inter(2*nod,left,div);
if(div<fin) inter(2*nod+1,div+1,right);
}

int main()
{freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
int i;
for(i=1;i<=n;i++)
{scanf("%d",&val);
pos=i;init(1,1,n);}
int x,y,z;
for(i=1;i<=m;i++)
{scanf("%d %d %d",&x,&y,&z);
if(x==0)
{maxim=-1;
start=y;fin=z;
inter(1,1,n);
printf("%d\n",maxim);}
else {pos=y;val=z;init(1,1,n);}
}
fclose(stdin);
fclose(stdout);
return 0;}