Cod sursa(job #1777111)

Utilizator demetriad-dagpagDavid Demetriad demetriad-dagpag Data 12 octombrie 2016 07:44:08
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda cerculdeinfo-lectia2-arborideintervale Marime 1.2 kb
#include <stdio.h>
#include <stdlib.h>
#define INF 1
int s[2000001],nrmax;
int max(int a,int b)
{
    if(a>b)
        return a;
    return b;
}
void update(int st,int dr,int x,int pos,int k)
{
    if(st<dr){
        if(k<=(st+dr)/2)
            update(st,(st+dr)/2,x,pos*2,k);
        else
            update((st+dr)/2+1,dr,x,pos*2+1,k);
        s[pos]=max(s[pos*2],s[pos*2+1]);
    }
    else
        s[pos]=x;
}
int search_max(int st,int dr,int pos,int a,int b)
{
    if(a<=st && b>=dr)
        return s[pos];
    else{
        int m1, m2;
        m1=m2=-INF;
        if(a<=(st+dr)/2)
            m1=search_max(st,(st+dr)/2,pos*2,a,b);
        if(b>(st+dr)/2)
            m2=search_max((st+dr)/2+1,dr,pos*2+1,a,b);
        return max(m1,m2);
    }
}
int main()
{
    int n,q,i,x,c,a,b;
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&q);
    for(i=1; i<=n; i++){
        scanf("%d",&x);
        update(1,n,x,1,i);
    }
    for(i=1; i<=q; i++)
    {
        scanf("%d%d%d",&c,&a,&b);
        if(c==0)
            printf("%d\n",search_max(1,n,1,a,b));
        else
            update(1,n,b,1,a);
    }

    return 0;
}