Cod sursa(job #3357847)

Utilizator poenar_rares_emanuelPoenar Rares Emanuel poenar_rares_emanuel Data 13 iunie 2026 16:40:36
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <stdio.h>

#define MAXN 100005
int N,M;
int arb[4*MAXN];

void construieste(int nod,int st,int dr,int A[]){
    if(st==dr){
        arb[nod]=A[st];
        return;
    }

    int mij=(st + dr)/2;

    construieste(2*nod,st,mij,A);
    construieste(2*nod+1,mij+1,dr,A);

    arb[nod]=arb[2*nod];
    if(arb[2*nod+1]>arb[nod]){
        arb[nod]=arb[2*nod+1];
    }
}

void actualizeaza(int nod,int st,int dr,int poz,int valoare){
    if(st==dr){
        arb[nod]=valoare;
        return;
    }

    int mij=(st+dr)/2;

    if(poz<=mij){
        actualizeaza(2*nod,st,mij,poz,valoare);
    } else {
        actualizeaza(2*nod+1,mij+1,dr,poz,valoare);
    }

    arb[nod]=arb[2*nod];
    if(arb[2*nod+1]>arb[nod]){
        arb[nod]=arb[2*nod+1];
    }
}

int interogheaza(int nod,int st,int dr,int a,int b){
    if(dr<a || st>b){
        return 0;
    }

    if(a<=st && dr<=b){
        return arb[nod];
    }

    int mij=(st+dr)/2;

    int maxStanga=interogheaza(2*nod,st,mij,a,b);
    int maxDreapta=interogheaza(2*nod+1,mij+1,dr,a,b);

    if(maxStanga>maxDreapta){
        return maxStanga;
    } else {
        return maxDreapta;
    }
}

int A[MAXN];

int main(){

    FILE *fin=fopen("arbint.in","r");
    FILE *fout=fopen("arbint.out","w");

    fscanf(fin,"%d %d",&N,&M);

    for(int i=1;i<=N;i++){
        fscanf(fin,"%d",&A[i]);
    }

    construieste(1,1,N,A);

    for(int m =0;m<M;m++){
        int tip,a,b;
        fscanf(fin,"%d %d %d",&tip,&a,&b);

        if(tip==0){
            int rezultat=interogheaza(1,1,N,a,b);
            fprintf(fout,"%d\n",rezultat);
        } else {
            actualizeaza(1,1,N,a,b);
        }
    }

    fclose(fin);
    fclose(fout);

    return 0;
}