/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 11ms 27.57 MiB
#2 Accepted 12ms 27.84 MiB
#3 Accepted 125ms 28.199 MiB
#4 Accepted 119ms 30.172 MiB
#5 Accepted 105ms 30.0 MiB
#6 Accepted 99ms 27.797 MiB
#7 Accepted 14ms 28.484 MiB
#8 Accepted 14ms 28.121 MiB
#9 Accepted 132ms 30.754 MiB
#10 Accepted 143ms 28.25 MiB

Code

#include <bits/stdc++.h>
using namespace std;

const int N = 3e5 + 9;
const int inf = 2e9 + 7;
#define int long long
int a[N];

struct ST
{
    struct Node
    {
        bool isSorted;
        int minVal, maxVal;
    } t[4 * N];

    Node merge(Node left, Node right)
    {
        Node parent;
        parent.isSorted = left.isSorted && right.isSorted && (left.maxVal <= right.minVal);
        parent.minVal = min(left.minVal, right.minVal);
        parent.maxVal = max(left.maxVal, right.maxVal);
        return parent;
    }

    void build(int n, int b, int e)
    {
        if (b == e)
        {
            t[n].isSorted = true;
            t[n].minVal = a[b];
            t[n].maxVal = a[b];
            return;
        }
        int mid = (b + e) >> 1;
        build(n << 1, b, mid);
        build(n << 1 | 1, mid + 1, e);
        t[n] = merge(t[n << 1], t[n << 1 | 1]);
    }

    void upd(int n, int b, int e, int i, int x)
    {
        if (b > i || e < i)
            return;
        if (b == e && b == i)
        {
            t[n].isSorted = true;
            t[n].minVal = x;
            t[n].maxVal = x;
            return;
        }
        int mid = (b + e) >> 1;
        upd(n << 1, b, mid, i, x);
        upd(n << 1 | 1, mid + 1, e, i, x);
        t[n] = merge(t[n << 1], t[n << 1 | 1]);
    }

    Node query(int n, int b, int e, int i, int j)
    {
        if (b > j || e < i)
            return {true, inf, -inf};
        if (b >= i && e <= j)
            return t[n];
        int mid = (b + e) >> 1;
        Node leftQuery = query(n << 1, b, mid, i, j);
        Node rightQuery = query(n << 1 | 1, mid + 1, e, i, j);
        return merge(leftQuery, rightQuery);
    }
} t;

int32_t main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n, Q;
    cin >> n;

    for (int i = 1; i <= n; ++i)
    {
        cin >> a[i];
    }
    t.build(1, 1, N);

    cin >> Q;
    while (Q--)
    {
        int type;
        cin >> type;

        if (type == 1)
        {
            int i, x;
            cin >> i >> x;
            t.upd(1, 1, N, i, x);
        }
        else if (type == 2)
        {
            int l, r;
            cin >> l >> r;
            auto x = t.query(1, 1, N, l, r);
            if (x.isSorted)
                cout << "YES\n";
            else
                cout << "NO\n";
            // cout << x.isSorted << '\n';
        }
    }

    return 0;
}

Information

Submit By
Type
Submission
Problem
P1085 Sorted or !Sorted
Contest
Bangladesh 2.0
Language
C++20 (G++ 13.2.0)
Submit At
2024-08-16 16:51:59
Judged At
2024-08-16 16:51:59
Judged By
Score
100
Total Time
143ms
Peak Memory
30.754 MiB