Cod sursa(job #384801)

Utilizator cristikIvan Cristian cristik Data 20 ianuarie 2010 23:14:22
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <stdio.h>
#define maxn 100010
#define BUCKET 256
#define bucket(x) ((x)/BUCKET)
#define first(x) ((x)*BUCKET)
int max(int a,int b) {if(a>b) return a; return b; }
int val[maxn],maxbuc[maxn/BUCKET],n,m,x,i,j;
void update(int k,int x)
{
    int b=bucket(k);
    if(val[k]==maxbuc[b])
    {
        maxbuc[b]=val[k]=0;
        for(int i=first(b); i<first(b+1); i++)
         if(val[i]>maxbuc[b]) maxbuc[b]=val[i];
    }
    val[k]=x;
    if(x>maxbuc[b]) maxbuc[b]=x;
}
int query(int st,int dr)
{
    int b1=bucket(st),b2=bucket(dr),sol=0;
    for(int i=b1+1; i<b2; i++)
     if(maxbuc[i]>sol) sol=maxbuc[i];
    if(sol<maxbuc[b1])
     for(int i=st; i<first(b1+1) && i<=dr; i++)
      if(val[i]>sol) sol=val[i];
    if(sol<maxbuc[b2])
     for(int i=max(first(b2),st); i<=dr; i++)
      if(val[i]>sol) sol=val[i];
    return sol;
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=0; i<n; i++) { scanf("%d",&val[i]); if(val[i]>maxbuc[bucket(i)]) maxbuc[bucket(i)]=val[i]; }

    for(; m>0; m--)
    {
        scanf("%d%d%d",&x,&i,&j);
        if(x==1) update(i-1,j);
        else printf("%d\n",query(i-1,j-1));
    }
    return 0;

}