Cod sursa(job #3125211)

Utilizator PHOSSESSEDProsie Radu-Teodor PHOSSESSED Data 2 mai 2023 12:14:00
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.14 kb
#include <bits/stdc++.h>
class InParser {
private:
    FILE *fin;
    char *buff;
    short pos = 4095;
    inline char get_ch() {
        ++ pos;
        if (pos == 4096) {
            pos = 0;
            fread(buff, 1, 4096, fin);
        }
        return buff[pos];
    }
public:
    InParser(const char *file) {
        fin = fopen(file, "r");
        buff = new char[4096]();
    }
    InParser& operator >> (int &x) {
        char ch = get_ch();
        while (!isdigit(ch))
            ch = get_ch();
		x = ch - '0';
        ch = get_ch();
        while (isdigit(ch)) {
            x = x * 10 + ch - '0';
            ch = get_ch();
        }
        return *this;
    }
};
class OutParser {
private:
    FILE *fout;
    char *buff;
    short pos = 0;
    inline void write_ch(char ch) {
        if (pos == 4096) {
            pos = 0;
            fwrite(buff, 1, 4096, fout);
        }
        buff[pos] = ch;
        ++ pos;
    }
public:
    OutParser(const char *file) {
        fout = fopen(file, "w");
        buff = new char[4096]();
    }
    ~OutParser() {
        fwrite(buff, 1, pos, fout);
        fclose(fout);
    }
    OutParser& operator << (int x) {
        if (x < 10)
            write_ch(x + '0');
        else {
            (*this) << (x / 10);
            write_ch(x % 10 + '0');
        }
        return *this;
    }
    OutParser& operator << (char ch) {
        write_ch(ch);
        return *this;
    }
};
int n, queries, aint[400000], v[100000], i;
inline void build(int node, int nleft, int nright) {
    if (nleft == nright)
        aint[node] = v[nleft];
    else {
        int mid = (nleft + nright) >> 1;
        build(node << 1, nleft, mid);
        build((node << 1) + 1, mid + 1, nright);
        aint[node] = std :: max(aint[node << 1], aint[(node << 1) + 1]);
    }
}
int left, right;
inline int query(int node, int nleft, int nright) {
    if (left > nright or right < nleft)
        return -1;
    if (left <= nleft and right >= nright)
        return aint[node];
    int mid = (nleft + nright) >> 1;
    return std :: max(query(node << 1, nleft, mid), query((node << 1) + 1, mid + 1, nright));
}
int update_pos, val;
inline void update(int node, int nleft, int nright) {
    if (nleft == nright)
        aint[node] = val;
    else {
        int mid = (nleft + nright) >> 1;
        if (update_pos <= mid)
            update(node << 1, nleft, mid);
        else
            update((node << 1) + 1, mid + 1, nright);
        aint[node] = std :: max(aint[node << 1], aint[(node << 1) + 1]);
    }
}
int x, y, op;
int main() {
    std :: ios_base :: sync_with_stdio(0);
    InParser fin("arbint.in");
    fin >> n >> queries;
    for (i = 1; i <= n; ++ i)
        fin >> v[i];
    build(1, 1, n);
    OutParser fout("arbint.out");
    while (queries) {
        -- queries;
        fin >> op >> x >> y;
        if (op == 1) {
            update_pos = x;
            val = y;
            update(1, 1, n);
        }
        else {
            left = x;
            right = y;
            fout << query(1, 1, n) << '\n';
        }
    }
    return 0;
}