Cod sursa(job #2679081)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 29 noiembrie 2020 16:26:09
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>

using namespace std;

int main() {
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");

    int n, m;
    cin >> n >> m;

    int bucket_size = sqrt(n);
    int no_buckets = ceil(1.0 * n / bucket_size);

    vector <int> v(n), bucket(no_buckets, 0);
    
    for (int i = 0; i < n; ++i) {
        cin >> v[i];
        bucket[i / bucket_size] = max(v[i], bucket[i / bucket_size]);
    }    

    while (m--) {
        int op, l, r;
        cin >> op >> l >> r; --l; --r;

        int l_buk = l / bucket_size;
        int r_buk = r / bucket_size;

        if (op == 0) {
            int ans = 0;

            if (l_buk == r_buk) {
                for (int i = l; i <= r; ++i) 
                    ans = max(ans, v[i]);
            }
            else {
                for (int i = l; i < n and i / bucket_size == l_buk; ++i) 
                    ans = max(ans, v[i]);
                
                for (int i = r; i >= 0 and i / bucket_size == r_buk; --i) 
                    ans = max(ans, v[i]);

                for (int i = l_buk + 1; i < r_buk; ++i)
                    ans = max(ans, bucket[i]);
            }
            cout << ans << '\n';
        }
        else {
            int val = r + 1;

            v[l] = val;
            if (val >= bucket[l_buk])
                bucket[l_buk] = val;
            else {
                bucket[l_buk] = val;
                for (int i = l_buk * bucket_size; i < n and i / bucket_size == l_buk; ++i)
                    bucket[l_buk] = max(bucket[l_buk], v[i]);
            }
        }
    }

    return 0;
}