Cod sursa(job #1785890)

Utilizator iAnduAlexandru Banu iAndu Data 22 octombrie 2016 05:19:15
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;

void init (int rad, vector<int> vec, vector<int> &bucket) {
    int part = 0, nrBuckets = vec.size() / rad;

    while (part < nrBuckets) {
        int maxim = vec[part * rad], finish = rad * (part + 1);
        for (int i = part * rad + 1; i < finish; ++i) {
            maxim = max(maxim, vec[i]);
        }
        bucket.push_back(maxim);
        ++part;
    }
    if (rad * part != vec.size()) {
        int maxim = vec[part * rad], length = vec.size();
        for (int i = part * rad + 1; i < length; ++i) {
            maxim = max(maxim, vec[i]);
        }
        bucket.push_back(maxim);
    }
}

int maxim_batog (int a, int b,int rad, vector<int> vec, vector<int> bucket) {
    int maxim = vec[a];

    while (a % rad != 0 && a < b) {
        maxim = max(maxim, vec[a++]);
    }
    while (b - a + 1 >= rad) {
        maxim = max(maxim, bucket[a / rad]);
        a += rad;
    }
    while (a <= b) {
        maxim = max(maxim, vec[a++]);
    }

    return maxim;
}

void update (int part, int rad, vector<int> vec, vector<int> &bucket) {
    int maxim = vec[part * rad], finish = rad * (part + 1);

    for (int i = part * rad; i < finish; ++i) {
        maxim = max(maxim, vec[i]);
    }
    bucket[part] = maxim;
}

int main() {
    int n, m, rad;
    vector<int> vec, bucket;

    FILE *in = fopen("arbint.in", "r");
    fscanf (in, "%d %d", &n, &m);
    for (int i = 0; i < n; ++i) {
        int x;
        fscanf (in, "%d", &x);
        vec.push_back(x);
    }

    rad = sqrt(n);
    init (rad, vec, bucket);

    FILE *out = fopen("arbint.out", "w");
    for (int i = 0; i < m; ++i) {
        int op, a, b;
        fscanf(in, "%d %d %d", &op, &a, &b);
        if (op == 0) {
            fprintf(out, "%d\n", maxim_batog(a - 1, b - 1, rad, vec, bucket));
        } else {
            vec[a - 1] = b;
            update((a - 1) / rad, rad, vec, bucket);
        }
    }
    fclose(in);
    fclose(out);

    return 0;
}