Cod sursa(job #2674956)

Utilizator Mihaela...Mihaela Zmeu Mihaela... Data 20 noiembrie 2020 21:18:28
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.7 kb
#include "bits/stdc++.h"

using namespace std;

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

    int n, m;
    cin >> n >> m;
    vector<int> v(n);
    vector<int> ab;
    int mx = -1;
    for(int i = 0; i < n; i++) {
        cin >> v[i];
        if(i % 100 != 0 || i == 0) {
            if(mx < v[i]) {
                mx = v[i];
            }
        }
        else {
            ab.push_back(mx);
            mx = -1;
        }
        if (mx != -1 && i == (n - 1)) {
            ab.push_back(mx);
        }
    }

    for ( int i = 0 ; i < m; i++) {
        int s = -1;
        int o, a, b;
        cin >> o >> a >> b;
        if (o == 1) {
            v[a - 1] = b;
            int p = (a - 1) / 100;
            ab[p] = 0;
            if ( p != 0 && p != ab.size()) {
                for (int r = 100 * p; r < (p * 100) + 100; r++) {
                    if ( ab[p] < v[r]) {
                        ab[p] = v[r];
                    }
                }
            }
            if (p == 0) {
                for (int r = 0; r < 100; r++) {
                    if ( ab[p] < v[r]) {
                        ab[p] = v[r];
                    }
                }
            }
            if ( p == ab.size()) {
                for (int r = 100 * p; r < ab.size(); r++) {
                    if ( ab[p] < v[r]) {
                        ab[p] = v[r];
                    }
                }
            }
        }

        else {
            if((a - 1) / 100 == (b - 1) / 100) {
                for(int e = a - 1; e < b; e++) {
                    if(s < v[e]) {
                        s = v[e];
                    }
                }
            }
            else {
                int q = (a - 1) / 100;
                int q1 = (b - 1) / 100;
                if ((a - 1) % 100 != 0) {
                    q++;
                }
                if ((b - 1) % 100 == 99) {
                    q1++;
                }
                if(q != q1) {
                    for(int e = q; e < q1; e++) {
                        if(s < ab[e]) {
                            s = ab[e];
                        }
                    }
                }
                while ((a - 1) % 100 > 0) {
                    if (s < v[a - 1]) {
                        s = v[a - 1];
                    }
                    a++;
                }
                while((b - 1) % 100 >= 0 && (b - 1) % 100 != 99) {
                    if (s < v[b - 1]) {
                        s = v[ b - 1];
                    }
                    b--;
                }
            }
            cout << s << '\n';
        }
    }
    return 0;
}