Cod sursa(job #144567)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 27 februarie 2008 19:40:44
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 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 maxn (1<<17)
int n,m,a,b,r,A[maxn],t[2*maxn];
int query(int nod,int st,int dr)
{
  int mij,v1,v2;
  if(a<=st&&dr<=b) return t[nod];
  else
  {
    mij=(st+dr)>>1;
    if(a<=mij) v1=query((nod<<1),st,mij);
    else v1=0;
    if(b>=mij+1) v2=query((nod<<1)+1,mij+1,dr);
    else v2=0;
    return max(v1,v2);
  }
}
void update(int nod,int st,int dr)
{
  int mij;
  if(st==dr) t[nod]=b;
  else
  {
    mij=(st+dr)>>1;
    if(a<=mij) update((nod<<1),st,mij);
    else update((nod<<1)+1,mij+1,dr);
    t[nod]=max(t[(nod<<1)],t[(nod<<1)+1]);
  }
}
int main()
{
  int i;
  fscanf(fin,"%d%d",&n,&m);
  for(i=1;i<=n;i++)
    fscanf(fin,"%d",&A[i]);
  memset(t,0,sizeof(t));
  for(i=1;i<=n;i++)
  {
    a=i;b=A[i];
    update(1,1,n);
  }
  for(i=1;i<=m;i++)
  {
    fscanf(fin,"%d%d%d",&r,&a,&b);
    if(r)
    {
      A[a]=b;
      update(1,1,n);
    }
    else fprintf(fout,"%d\n",query(1,1,n));
  }
  fclose(fin);
  fclose(fout);
  return 0;
}