Cod sursa(job #3134227)

Utilizator cristina_ovidiuCristina Ovidiu Lucian cristina_ovidiu Data 28 mai 2023 19:25:27
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

#define max(a,b)    (a > b) ? (a) : (b)

void buildTree(int *v,int *t,int nod,int l,int r){
    // printf("nod %d l:%d r:%d\n",nod,l,r);
    if(l > r){
        return;
    }
    if(l == r){
        t[nod] = v[l];
    }
    else{
        int m = (l + r) / 2;
        buildTree(v,t,2 * nod,l,m);
        buildTree(v,t,2 * nod + 1,m + 1,r);
        t[nod] = max(t[2 * nod],t[2 * nod + 1]);
    }
}

void update(int *t,int nod,int pos,int val,int l,int r){
    if(l == r){
        t[nod] = val;
    }
    else{
        int m = (l + r) / 2;
        if(pos <= m){
            update(t,2 * nod,pos,val,l,m);
        }
        else{
            update(t,2 * nod + 1,pos,val,m + 1,r);
        }
        t[nod] = max(t[2 * nod],t[2 * nod + 1]);
    }
}

void query(int *t,int nod,int l,int r,int x,int y,int *ans){
    if(l >= x && r <= y){
        *ans = max(*ans,t[nod]);
    }
    else{
        int m = (l + r) / 2;
        if(x <= m){
            query(t,2 * nod,l,m,x,y,ans);
        }
        if(y > m){
            query(t,2 * nod + 1,m + 1,r,x,y,ans);
        }
    }
}

int main(){
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int n,m,a,b,o,ans;
    scanf("%d %d",&n,&m);

    int *v = malloc((n + 5) * sizeof(int));
    int *t = malloc((4 * n + 5) * sizeof(int));

    for(int i = 1;i <= n;++i){
        scanf("%d",v+i);
    }
    
    buildTree(v,t,1,1,n);

    for(int i=0;i<m;++i){
        scanf("%d %d %d",&o,&a,&b);
        if(o == 0){
            ans = -INT_MAX;
            query(t,1,1,n,a,b,&ans);
            printf("%d\n",ans);
        }
        else{
            update(t,1,a,b,1,n);
        }
    }

    return 0;
}