Cod sursa(job #2375792)

Utilizator amaliarebAmalia Rebegea amaliareb Data 8 martie 2019 12:12:36
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>

using namespace std;
const int maxn = 100005;
int v[maxn], n, m;

struct AINT {
    int aint[4 * maxn];
    int ans;

    AINT() {
        memset(aint, 0, sizeof aint);
    }

    void Update(int node, int nst, int ndr, int poz, int val) {
        if (poz < nst || poz > ndr) return;
        if (nst == ndr) {
            aint[node] = val;
            return;
        }

        int mid = (nst + ndr) / 2;
        Update(2 * node, nst, mid, poz, val);
        Update(2 * node + 1, mid + 1, ndr, poz, val);
        aint[node] = max(aint[2 * node], aint[2 * node + 1]);
    }

    void Reset() {
        ans = 0;
    }

    void Query(int node, int nst, int ndr, int qst, int qdr) {
        if (qdr < nst || qst > ndr) return;
        if (nst >= qst && ndr <= qdr) {
            ans = max(ans, aint[node]);
            return;
        }

        int mid = (nst + ndr) / 2;
        Query(2 * node, nst, mid, qst, qdr);
        Query(2 * node + 1, mid + 1, ndr, qst, qdr);
    }
} a1;

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

    cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        int val;
        cin >> val;
        a1.Update(1, 1, n, i, val);
    }

    for (int i = 1; i <= m; ++i) {
        int a, b, c;
        cin >> a >> b >> c;
        if (a == 1)
            a1.Update(1, 1, n, b, c);
        else a1.Reset(), a1.Query(1, 1, n, b, c), cout << a1.ans << '\n';
    }
    return 0;
}