Cod sursa(job #3349243)

Utilizator filipdanieloanFilip-Daniel Oancea filipdanieloan Data 26 martie 2026 20:28:33
Problema Arbori de intervale Scor 100
Compilator c-32 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <stdio.h>
#include <math.h>

int n, m, v[1000000], bucket[500];
int bucket_size;
FILE* fin, *fout;

void update(int a, int b) {
    v[a-1] = b;
    int where = (a-1) / bucket_size;
    int st_bucket = where * bucket_size;
    int end_bucket = (where + 1) * bucket_size - 1;
    bucket[where]=0;
    for(int i=st_bucket;i<=end_bucket;++i) {
        if(bucket[where] < v[i])
            bucket[where] = v[i];
    }
}

void query(int a, int b) {
    --a;
    --b;
    int rez = 0;
    int bucket_a = a / bucket_size;
    int bucket_b = b / bucket_size;
    if(bucket_a == bucket_b) {
        for(int i=a;i<=b;++i)
            if(rez < v[i])
                rez=v[i];
        fprintf(fout, "%d\n", rez);
        return;
    }
    int end_a = (bucket_a+1) * bucket_size - 1;
    int st_b = bucket_b * bucket_size;
    for(int i=a;i<=end_a;++i) {
        if(rez < v[i])
            rez=v[i];
    }
    for(int i=st_b;i<=b;++i) {
        if(rez < v[i])
            rez=v[i];
    }
    for(int i=bucket_a+1;i<bucket_b;++i) {
        if(rez < bucket[i])
            rez=bucket[i];
    }
    fprintf(fout, "%d\n", rez);
}

int main() {
    fin = fopen("arbint.in", "r");
    fscanf(fin, "%d%d", &n, &m);
    bucket_size = sqrt(n);
    for(int i=0;i<n;++i) {
        fscanf(fin, "%d", &v[i]);
        int where = i / bucket_size;
        if(bucket[where] < v[i])
            bucket[where] = v[i];
    }

    fout = fopen("arbint.out", "w");
    while(m--) {
        int nr, a, b;
        fscanf(fin, "%d%d%d", &nr, &a, &b);
        if(nr == 1)
            update(a, b);
        else
            query(a, b);
    }

    fclose(fin);
    fclose(fout);

    return 0;
}