Cod sursa(job #2076715)

Utilizator dariusdariusMarian Darius dariusdarius Data 26 noiembrie 2017 23:26:54
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <algorithm>
#include <fstream>
#include <iostream>
using namespace std;

const int MAX_N = 100005;

int a[MAX_N];
int buckets[MAX_N];

void UpdateBucket(int bucket, int k, int n) {
    int first = (bucket - 1) * k + 1;
    int last = min(bucket * k, n);
    buckets[bucket] = a[first];
    for (int i = first + 1; i <= last; ++ i) {
        buckets[bucket] = max(buckets[bucket], a[i]);
    }
}

int main() {
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");
    int n, m, k;
    cin >> n >> m;
    k = max(1, min(n, (int)sqrt(1.0 * n)));
    int num_buckets = n / k;
    for (int i = 1; i <= n; ++ i) {
        cin >> a[i];
    }
    for (int bucket = 1; bucket <= num_buckets; ++ bucket) {
        UpdateBucket(bucket, k, n);
    }
    for (int i = 1; i <= m; ++ i) {
        int type, x, y;
        cin >> type >> x >> y;
        if (type == 1) {
            a[x] = y;
            int bucket = (x - 1) / k + 1;
            UpdateBucket(bucket, k, n);
        } else {
            int best = a[x];
            while (x % k != 1 && x <= y) {
                best = max(best, a[x ++]);
            }
            while (y % k != 0 && x <= y) {
                best = max(best, a[y --]);
            }
            while (x <= y) {
                best = max(best, buckets[(x - 1) / k + 1]);
                x += k;
            }
            cout << best << "\n";
        }
    }
    return 0;
}