Cod sursa(job #1047357)

Utilizator Tudordmdaniel marin Tudordm Data 4 decembrie 2013 11:51:12
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<stdio.h>

const int inf=1e10;
int poz,val,a,b,t[1<<18];

int max(int a,int b){

    if(a<b) return b;
    return a;
}

int query(int p,int st,int dr){
    if(a<=st&&dr<=b)
        return t[p];
    int m=(st+dr)/2,m1=-inf,m2=-inf;
    if(a<=m)
        m1=query(2*p,st,m);
    if(m+1<=b)
        m2=query(2*p+1,m+1,dr);
    return max(m1,m2);
}

void update(int p,int st,int dr){
    if(st==dr){
        t[p]=val;
        return;
    }
    int m=(st+dr)/2;
    if(poz<=m)
        update(2*p,st,m);
    else
        update(2*p+1,m+1,dr);
    t[p]=max(t[2*p],t[2*p+1]);
}


int main(){

    int i,n,m,tip,q;

    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    scanf("%d%d",&n,&m);

    for(i=1;i<=n;i++){

        scanf("%d",&val);
        poz=i;
        update(1,1,n);

    }

    for(i=1;i<=m;i++){

        scanf("%d",&tip);

        if(tip==0){

            scanf("%d%d",&a,&b);
            q=query(1,1,n);
            printf("%d\n",q);

        }
        else{

            scanf("%d%d",&poz,&val);
            update(1,1,n);

        }
    }

    return 0;
}