Cod sursa(job #201999)

Utilizator mordredSimionescu Andrei mordred Data 5 august 2008 15:01:27
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <stdio.h>

int t[1<<15],m,n;
int pos, val, i, l, r, x, max;

void update(int,int,int);
void query (int,int,int);

int main(){
 freopen("arbint.in","r",stdin);   
 freopen("arbint.out","w",stdout);
 
 scanf("%d %d", &n, &m);
 
 for(i = 1; i <= n; ++i)
    {
    scanf("%d", &val);
    pos = i;
    update(1,1,n);
    }
 
 for(; m; --m)
    {
    scanf("%d %d %d", &x, &l, &r);
    if(!x)
        {
        max = 0;
        query(1,1,n);
        printf("%d\n", max);
        }
    else
        {
        pos = l;
        val = r;
        update(1,1,n);
        }
    }
 return 0;
}

void update (int nod, int st, int dr){
 if(st == dr){
    t[nod] = val;
    return;
    }
 int mid = (st + dr) / 2;
 if(pos <= mid)
    update (2 * nod, st, mid);
 else
    update (2 * nod + 1, mid+1, dr);
 if(t[2*nod]>t[2*nod+1])    
    t[nod] = t[2*nod];
 else
    t[nod] = t[2*nod+1];
}

void query (int nod, int st, int dr){
 if(l <= st && dr <= r){
    if(max < t[nod])
        max = t[nod];
    return;
    }
    
 int mid = (st + dr) / 2;
 if (l <= mid)
    query(2 * nod, st, mid);
 if (r >  mid)
    query(2 * nod + 1, mid + 1, dr);
     
}