Cod sursa(job #277724)

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