Cod sursa(job #1551366)

Utilizator Kira96Denis Mita Kira96 Data 15 decembrie 2015 19:37:53
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <bits/stdc++.h>
#define N 100100
using namespace std;

class Aint {
    private:
    int sol;
    int n;
    int v[N<<2];
    void go(int A[], int st, int dr, int po) {
        if (st == dr) {
            v[po] = A[st];
            return;
        }
        int mij = (st + dr) >> 1;
        go(A, st, mij, po << 1);
        go(A, mij + 1, dr, (po << 1) + 1);
        v[po] = max(v[po << 1], v[(po << 1) + 1]);
    };
    void find(int st, int dr, int po, int l, int r) {
        if (st >= l && dr <= r) {
            sol = max(sol, v[po]);
            return;
        }
        int mij = (st + dr) >> 1;
        if (l <= mij) {
            find(st, mij, po << 1, l, r);
        }
        if (r > mij) {
            find(mij + 1, dr, (po << 1) + 1, l, r);
        }
    };
    void update(int st, int dr, int po, int p, int x) {
        if (st == dr) {
            v[po] = x;
            return;
        }
        int mij = (st + dr) >> 1;
        if (p <= mij) {
            update(st, mij, po << 1, p, x);
        } else {
            update(mij + 1, dr, (po << 1) + 1, p, x);
        }
        v[po] = max (v[po << 1], v[(po << 1) + 1]);
    };
    public :
    Aint (int values[], int size) {
        go(values, 1, size, 1);
        n = size;
    };
    int fnd(int st, int dr) {
        sol = 0;
        find(1, n, 1, st, dr);
        return sol;
    };
    void upd(int poz,int x) {
        update(1, n, 1, poz, x);
    };
};

int v[N], n, l, r, q, x, t, p;

int main () {
    fin >> n >> q;
    for (int i = 1; i <= n; ++i) {
        fin >> v[i];
    }
    Aint a = Aint(v, n);
    for (int i = 1; i <= q; ++i) {
        fin >> t;
        if (!t) {
            fin >> l >> r;
            fout << a.fnd(l, r) << "\n";
        } else {
            fin >> p >> x;
            a.upd(p, x);
        }
    }
    return 0;
}