Cod sursa(job #2813392)

Utilizator iraresmihaiiordache rares mihai iraresmihai Data 6 decembrie 2021 15:44:15
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <stdio.h>

using namespace std;

FILE *fin, *fout;

#define MAXN 100000
#define RAD_MAXN 400

int v[MAXN + 1];
int batog[RAD_MAXN];

int radn;

int calcRad(int nr) {
    int i;

    i = 0;
    while ( i * i <= nr ) {
        i++;
    }
    i--;

    return i;
}

int calcAns(int first, int last) {
    int first_seq, last_seq, maxval;

    first_seq = first / radn + (first % radn > 1);
    last_seq = last / radn - 1;

    maxval = 0;

    while ( first < (first_seq + 1) * radn ) {
        if ( maxval < v[first] ) {
            maxval = v[first];
        }

        first++;
    }

    while ( first_seq <= last_seq ) {
        if ( maxval < batog[first_seq] ) {
            maxval = batog[first_seq];
        }
        first_seq++;
    }

    while ( last > (last_seq + 1) * radn ) {
        if ( maxval < v[last] ) {
            maxval = v[last];
        }
        last--;
    }

    return maxval;
}

void update(int poselem, int val) {
    int sequence, i;

    sequence = poselem / radn - (poselem % radn == 0);

    if ( batog[sequence] == v[poselem] ) {
        batog[sequence] = 0;
        v[poselem] = val;

        for ( i = (sequence - 1) * radn + 1; i <= sequence * radn; i++ ) {
            if ( batog[sequence] < v[i] )
                batog[sequence] = v[i];
        }
    } else
        v[poselem] = val;
}
int main() {
    int n, m, q, a, b, i;

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

    fscanf(fin, "%d%d", &n, &m);

    radn = calcRad(n);

    for  ( i = 1; i <= n; i++ ) {
        fscanf(fin, "%d", &v[i]);

        if ( v[i] > batog[i / radn - (i % radn == 0)] )
            batog[i / radn - (i % radn == 0)] = v[i];
    }

    while ( m-- ) {
        fscanf(fin, "%d%d%d", &q, &a, &b);

        if ( q == 0 ) {
            fprintf(fout, "%d\n", calcAns(a, b));
        } else {
            update(a, b);
        }
    }

    fclose(fin);
    fclose(fout);

    return 0;
}