Cod sursa(job #3292324)

Utilizator TheAndreiEnache Andrei Alexandru TheAndrei Data 7 aprilie 2025 21:51:34
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <stdio.h>
#include <algorithm>

int aint[1024*256];
int n2;

void update(int i, int x){
    i+=n2;
    aint[i]=x;
    i/=2;
    while(i){
        aint[i]=std::max(aint[i*2], aint[2*i+1]);
        i>>=1;
    }
}

int query(int l, int r){
    l+=n2;r+=n2;
    int max=0;
    while(l<=r){
        if(l&1){
            max=std::max(max, aint[l]);
            l++;
        }
        l>>=1;

        if(!(r&1)){
            max=std::max(max, aint[r]);
            r--;
        }
        r>>=1;
    }
    return max;
}

int main(){
    FILE *fin, *fout;
    int n,m,i,x,y,type;

    fin=fopen("arbint.in", "r");
    fscanf(fin, "%d%d", &n, &m);
    n2=1;
    while(n2<n)
        n2*=2;

    for(i=0; i<n; i++){
        fscanf(fin, "%d", &aint[n2+i]);
    }

    for(i=n2-1; i>0; i--)
        aint[i]=std::max(aint[2*i], aint[2*i+1]);

    fout=fopen("arbint.out", "w");
    for(i=0; i<m; i++){
        fscanf(fin, "%d%d%d", &type, &x, &y);
        x--;

        if(type==0)
            fprintf(fout, "%d\n", query(x, y-1));
        else
            update(x, y);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}