Cod sursa(job #2685069)

Utilizator H7GhosTsdfgsd asdf H7GhosT Data 15 decembrie 2020 21:21:34
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 5.41 kb

#include <bits/stdc++.h>
#pragma GCC diagnostic ignored "-Wunused-result"
using namespace std; typedef long long ll; typedef unsigned long long ull; typedef vector<int> vi; typedef vector<ll> vl; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef vector<pii> vii; typedef vector<pll> vll;

template<class T> std::istream& operator>>(std::istream& stream, vector<T> &v) { for (T& t: v) { stream >> t; } return stream; } template <class T> std::ostream& operator<<(std::ostream& stream, const vector<T> &v) { for (const T& t : v) { stream << t << ' '; } return stream; } template <class T, class U> std::istream& operator>>(std::istream& stream, pair<T, U>& p) { return stream >> p.first >> p.second; } template <class T, class U> std::ostream& operator<<(std::ostream& stream, const pair<T, U>& p) { return stream << p.first << ' ' << p.second << ' '; } 

template<typename T> void read(T& t) { cin >> t; } template<typename T, typename... TArgs> void read(T& t, TArgs&&... args) { read(t); read(forward<TArgs>(args)...); } template <typename T> void readc(T& t); template<> void readc(int& v) { scanf("%d", &v); } template<> void readc(unsigned int& v) { scanf("%u", &v); } template<> void readc(char& v) { scanf(" %c", &v); } template<> void readc(long long& v) { scanf("%lld", &v); } template<> void readc(unsigned long long& v) { scanf("%llu", &v); } template<> void readc(float& v) { scanf("%f", &v); } template<> void readc(double& v) { scanf("%lf", &v); } template<size_t sz> void readc(char (&str)[sz]) { scanf("%s", str); } template<> void readc(char*& str) { scanf("%s", str); } template<typename E, typename U> void readc(pair<E, U>& v) { readc(v.first); readc(v.second); } template<typename E> void readc(vector<E>& v) { for (E& e : v) readc(e); } template<typename T, typename... TArgs> void readc(T& t, TArgs&&... args) { readc(t); readc(forward<TArgs>(args)...); }

template <typename T> void printc(T t); template<> void printc(int v) { printf("%d ", v); } template<> void printc(unsigned int v) { printf("%u ", v); } template<> void printc(char v) { printf("%c ", v); } template<> void printc(long long v) { printf("%lld ", v); } template<> void printc(unsigned long long v) { printf("%llu ", v); } template<> void printc(float v) { printf("%f ", v); } template<> void printc(double v) { printf("%lf ", v); } template<> void printc<char *>(char *str) { printf("%s ", str); } template<> void printc<const char *>(const char *str) { printf("%s ", str); } template<typename E, typename U> void printc(const pair<E, U>& v) { printc(v.first); printc(v.second); } template<typename E> void printc(const vector<E>& v) { for (const E& e : v) printc(e); } template<typename T, typename... TArgs> void printc(const T& t, TArgs&&... args) { printc(t); printc(forward<TArgs>(args)...); }

template <typename T> void __DEBUG_BASE(const T& t) { cout << t; } template <typename T, typename... TArgs> void __DEBUG_BASE(const T& t, TArgs&&... args) { __DEBUG_BASE(t); cout << ", "; __DEBUG_BASE(forward<TArgs>(args)...); } template <typename... TArgs> void __DEBUG_IMPL(TArgs&&... args) { __DEBUG_BASE(forward<TArgs>(args)...); } 

char lower(char ch) { if (ch >= 'A' && ch <= 'Z') return ch - 'A' + 'a'; return ch; } char upper(char ch) { if (ch >= 'a' && ch <= 'z') return ch - 'a' + 'A'; return ch; } array<char, 5> VOWELS = {'a','e','i','o','u'}; bool isvowel(char ch) { return find(VOWELS.begin(), VOWELS.end(), lower(ch)) != VOWELS.end(); }; bool isupper(char ch) { return ch >= 'A' && ch <= 'Z'; } bool islower(char ch) { return ch >= 'a' && ch <= 'z'; } 

#define IO ios::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL)
#define endl '\n'
#define CF_FILE freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout)
#define PB_FILE(nm) freopen(nm ".in", "r", stdin); freopen(nm ".out", "w", stdout)
#define debug(...) cout << "[" << (#__VA_ARGS__) << "] = "; __DEBUG_IMPL(__VA_ARGS__); cout << endl


int main()
{
    IO;
    // CF_FLIE;
    PB_FILE("arbint");

    /* if (int a = 10; a == 10) {
     *     printf("Hello");
     * } */


    int n, m;
    readc(n,m);
    vector<int> v(n);
    readc(v);

    vi segtree(1 << (33 - __builtin_clz(n-1)));

    function<int(int, int, int)> make_seg = [&] (int l, int r, int i) {
        if (l == r) return segtree[i] = v[l];
        int m = l + (r - l) / 2;
        return segtree[i] = max(make_seg(l, m, i * 2 + 1), make_seg(m + 1, r, i * 2 + 2));
    };
    function<int(int, int, int, int, int)> query = [&] (int l, int r, int sl, int sr, int i) {
        if (l == sl && r == sr) return segtree[i];
        int sm = sl + (sr - sl) / 2;
        if (r <= sm) {
            return query(l, r, sl, sm, i * 2 + 1);
        }
        if (l > sm) {
            return query(l, r, sm + 1, sr, i * 2 + 2);
        }
        return max(query(l, sm, sl, sm, i * 2 + 1), query(sm + 1, r, sm + 1, sr, i * 2 + 2));
    };
    int j, val;
    function<int(int, int, int)> update = [&] (int l, int r, int i) {
        if (l == r) return segtree[i] = val;
        int m = l + (r - l) / 2;
        if (j <= m) {
            return segtree[i] = max(segtree[i * 2 + 2], update(l, m, i * 2 + 1));
        }
        return segtree[i] = max(segtree[i * 2 + 1], update(m + 1, r, i * 2 + 2));
    };
    make_seg(0, n - 1, 0);
    while (m--) {
        int c, l, r;
        readc(c, l, r);
        if (c == 0) {
            printf("%d\n", query(l - 1, r - 1, 0, n - 1, 0));
        } else {
            j = l - 1;
            val = r;
            update(0, n - 1, 0);
        }
    }
}