Cod sursa(job #3134653)

Utilizator mihai2387648Constantin Mihai mihai2387648 Data 30 mai 2023 02:35:55
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <stdio.h>

int tree[400001],max=-1;

int det_max(int node , int a , int b , int st , int dr){
    // if(a==b){
    //     if(tree[node]>max)
    //         max = tree[node];
    // }
    // else{
    //     int mij = (a+b)/2;
    //     det_max(2*node,a,mij);
    //     det_max(2*node+1,mij+1,b);
    // }
    int x=0,y=0;
    if(a <= st && b >=dr){
        return tree[node];
    }
    else{
        int mij=(st+dr)/2;
        if(a<=mij)
            x=det_max(2*node,a,b,st,mij);
        if(b>=mij+1)
            y=det_max(2*node+1,a,b,mij+1,dr);
        return x>y?x:y;
    }
}

void change(int node, int pos , int b , int st, int dr){
    if(st == dr)
        tree[node] = b;
    else{
        int mid = (st+dr)/2;
        if(pos<=mid)
            change(2*node,pos,b,st,mid);
        else
            change(2*node+1,pos,b,mid+1,dr);
    tree[node] = tree[2*node] > tree[2*node+1] ? tree[2*node] : tree[2*node+1];
    }
}

int main(){
    int op,a,b,n,m;
    freopen("arbint.in" , "r" , stdin);
    freopen("arbint.out" , "w" , stdout);

    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d" , &a);
        change(1,i,a,1,n);
    }

    for(int i=0;i<m;i++){
        if(scanf("%d %d %d" , &op,&a,&b)!=3)
            perror("Nu e bine boss");
        if(op == 0){
            printf("%d\n" , det_max(1,a,b,1,n));
        }
        else
            change(1,a,b,1,n);
    }
    return 0;
}