Cod sursa(job #3145505)

Utilizator ecaterinaEcaterina Stefanescu ecaterina Data 16 august 2023 00:54:21
Problema Arbori de intervale Scor 10
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <stdio.h>
#include <math.h>

#define NMAX 100002
#define SQMAX 317

int sq;

int v[NMAX];
int batog[SQMAX];

static inline void update(int poz, int val) {
    int i;
    if (batog[poz/sq]==v[poz]) {
        batog[poz/sq]=0;
        v[poz] = val;
        for (i=(poz+sq-1)/sq*sq; i<(poz/sq)*sq; i++) {
            if (batog[poz/sq]<v[i]) {
                batog[poz/sq] = v[i];
            }
        }
    } else {
        if (val>batog[poz/sq]) {
            batog[poz/sq] = val;
        }
        v[poz] = val;
    }
}

int query(int st, int dr) {
    int prim, ultim, rez;
    
    prim = (st+sq-1)/sq*sq;
    ultim = dr/sq*sq;
    
    rez=0;
    while (st<=dr && st<prim) {
        if (rez < v[st]) {
            rez=v[st];
        }
        st++;
    }
    while (dr>=st && dr>=ultim) {
        if (rez < v[dr]) {
            rez = v[dr];
        }
        dr--;
    }
    
    prim/=sq;
    ultim/=sq;
    while(prim<ultim) {
        if (rez<batog[prim]) {
            rez = batog[prim];
        }
        prim++;
    }
    return rez;
}

int main() {
    FILE *fin, *fout;
    fin = fopen("arbint.in", "r");
    fout = fopen("arbint.out", "w");
    
    int n, m, op, a, b, i, rez;
    
    fscanf(fin, "%d%d", &n, &m);
    sq = sqrt(n);
    
    for (i=0; i<n; i++) {
        fscanf(fin, "%d", &v[i]);
    }
    for (i=0; i<n; i++) {
        if (v[i]>batog[i/sq]) {
            batog[i/sq]=v[i];
        }
    }
    
    for (i=0; i<m; i++) {
        fscanf(fin, "%d%d%d", &op, &a, &b);
        if (op==1) {
            a--;
            update(a, b);
        } else {
            a--;
            b--;
            rez = query(a, b);
            fprintf(fout, "%d\n", rez);
        }
    }
    
    fclose(fin);
    fclose(fout);
    return 0;
}