Cod sursa(job #277740)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 11 martie 2009 21:24:47
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<stdio.h>
#include<string.h>
FILE*fin=fopen("arbint.in","r");
FILE*fout=fopen("arbint.out","w");
#define max(a,b)((a)>(b)?(a):(b))
#define nm 400000
int a,b,t[nm];
void update(int nod,int l,int r)
{
  int mid,v1=0,v2=0;   
  if(l==r) t[nod]=b;
  else
  {
      mid=(l+r)/2;
      if(a<=mid)
        update(2*nod,l,mid);
      else
        update(2*nod+1,mid+1,r);
      t[nod]=max(t[2*nod],t[2*nod+1]);
  }
}
int query(int nod,int l,int r)
{
  int mid=(l+r)/2,v1=0,v2=0;
  if(a<=l&&r<=b) return t[nod];
  if(a<=mid) v1=query(2*nod,l,mid);
  if(b>=mid+1) v2=query(2*nod+1,mid+1,r);
  return max(v1,v2);
}
int main()
{
  int i,x,n,m,q;  
  fscanf(fin,"%d%d",&n,&m);
  memset(t,0,sizeof(t));
  for(i=1;i<=n;i++)
  {
    fscanf(fin,"%d",&x);
    a=i;b=x;
    update(1,1,n);
  }
  for(i=1;i<=m;i++)
  {
    fscanf(fin,"%d%d%d",&q,&a,&b);
    if(q) update(1,1,n);
    else fprintf(fout,"%d\n",query(1,1,n));
  }
  fclose(fin);
  fclose(fout);
  return 0;
}