Submission details
Task:Lucky prefixes
Sender:Hornet's Multithreading
Submission time:2025-11-08 12:16:54 +0200
Language:C++ (C++17)
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.01 sdetails
#2ACCEPTED0.16 sdetails
#3ACCEPTED0.01 sdetails
#4ACCEPTED0.07 sdetails
#5ACCEPTED0.25 sdetails
#6ACCEPTED0.12 sdetails
#7ACCEPTED0.14 sdetails
#8ACCEPTED0.20 sdetails
#9ACCEPTED0.25 sdetails
#10ACCEPTED0.01 sdetails
#11ACCEPTED0.07 sdetails
#12ACCEPTED0.25 sdetails
#13ACCEPTED0.12 sdetails
#14ACCEPTED0.14 sdetails
#15ACCEPTED0.20 sdetails
#16ACCEPTED0.25 sdetails

Code

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

#define rep(i, a, b) for(int i = a; i < (b); i++)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;

const int N = 2e5 + 5;

struct segment_tree {
    long long mn[4 * N];
    long long lz[4 * N];

    segment_tree() {
        memset(mn, 0, sizeof(mn));
        memset(lz, 0, sizeof(lz));
    }

    void push(int id) {
        mn[id << 1] += lz[id];
        lz[id << 1] += lz[id];
        mn[id << 1 | 1] += lz[id];
        lz[id << 1 | 1] += lz[id];
        lz[id] = 0;
    }

    void upd(int id, int tl, int tr, int l, int r, long long x) {
        if (l <= tl && tr <= r) {
            mn[id] += x;
            lz[id] += x;
            return;
        }
        if (lz[id] != 0) {
            push(id);
        }
        int tm = (tl + tr) >> 1;
        if (r <= tm) {
            upd(id << 1, tl, tm, l, r, x);
        } else if (tm + 1 <= l) {
            upd(id << 1 | 1, tm + 1, tr, l, r, x);
        } else {
            upd(id << 1, tl, tm, l, r, x);
            upd(id << 1 | 1, tm + 1, tr, l, r, x);
        }
        mn[id] = min(mn[id << 1], mn[id << 1 | 1]);
    }

    long long get(int id, int tl, int tr, int l, int r) {
        if (l <= tl && tr <= r) {
            return mn[id];
        }
        if (lz[id] != 0) {
            push(id);
        }
        int tm = (tl + tr) >> 1;
        if (r <= tm) {
            return get(id << 1, tl, tm, l, r);
        } else if (tm + 1 <= l) {
            return get(id << 1 | 1, tm + 1, tr, l, r);
        } else {
            return min(get(id << 1, tl, tm, l, r), get(id << 1 | 1, tm + 1, tr, l, r));
        }
    }
};

int n, q;
int a[N];
segment_tree st;

void upd(int id, int x) {
    long long d = x - a[id];
    a[id] = x;
    st.upd(1, 1, n, id, n, d);
}

string que(int l, int r) {
    return st.get(1, 1, n, l, r) >= (l == 1 ? 0 : st.get(1, 1, n, l - 1, l - 1)) ? "YES" : "NO";
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    cin.exceptions(cin.failbit);
    cin >> n >> q;
    long long z = 0;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        z += a[i];
        st.upd(1, 1, n, i, i, z);
    }
    while (q--) {
        int t;
        cin >> t;
        if (t == 1) {
            int i, x;
            cin >> i >> x;
            upd(i, x);
        } else {
            int l, r;
            cin >> l >> r;
            cout << que(l, r) << '\n';
        }
    }
    
}

Test details

Test 1

Verdict: ACCEPTED

input
6 4
3 -2 1 5 6 1
2 1 3
2 2 3
1 3 -2
...

correct output
YES
NO
NO

user output
YES
NO
NO

Test 2

Verdict: ACCEPTED

input
200000 200000
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
NO
NO
NO
NO
NO
...

user output
NO
NO
NO
NO
NO
...

Test 3

Verdict: ACCEPTED

input
10 10
629447384 -729045992 811583872...

correct output
YES
NO
NO
NO
NO
...

user output
YES
NO
NO
NO
NO
...

Test 4

Verdict: ACCEPTED

input
1 200000
629447384
1 1 670017180
1 1 826751744
1 1 -804919168
...

correct output
NO
NO
NO
YES
YES
...

user output
NO
NO
NO
YES
YES
...

Test 5

Verdict: ACCEPTED

input
200000 200000
629447384 -729045992 811583872...

correct output
NO
NO
NO
NO
NO
...

user output
NO
NO
NO
NO
NO
...

Test 6

Verdict: ACCEPTED

input
1000 200000
629447384 -729045992 811583872...

correct output
NO
NO
NO
NO
NO
...

user output
NO
NO
NO
NO
NO
...

Test 7

Verdict: ACCEPTED

input
10000 200000
629447384 -729045992 811583872...

correct output
NO
NO
NO
NO
NO
...

user output
NO
NO
NO
NO
NO
...

Test 8

Verdict: ACCEPTED

input
100000 200000
629447384 -729045992 811583872...

correct output
NO
NO
NO
NO
NO
...

user output
NO
NO
NO
NO
NO
...

Test 9

Verdict: ACCEPTED

input
200000 200000
629447384 -729045992 811583872...

correct output
NO
NO
NO
NO
NO
...

user output
NO
NO
NO
NO
NO
...

Test 10

Verdict: ACCEPTED

input
10 10
629447384 -729045992 811583872...

correct output
YES
NO
NO
NO
NO
...

user output
YES
NO
NO
NO
NO
...

Test 11

Verdict: ACCEPTED

input
1 200000
629447384
1 1 670017180
1 1 826751744
1 1 -804919168
...

correct output
NO
NO
NO
YES
YES
...

user output
NO
NO
NO
YES
YES
...

Test 12

Verdict: ACCEPTED

input
200000 200000
629447384 -729045992 811583872...

correct output
NO
NO
NO
NO
NO
...

user output
NO
NO
NO
NO
NO
...

Test 13

Verdict: ACCEPTED

input
1000 200000
629447384 -729045992 811583872...

correct output
NO
NO
NO
NO
NO
...

user output
NO
NO
NO
NO
NO
...

Test 14

Verdict: ACCEPTED

input
10000 200000
629447384 -729045992 811583872...

correct output
NO
NO
NO
NO
NO
...

user output
NO
NO
NO
NO
NO
...

Test 15

Verdict: ACCEPTED

input
100000 200000
629447384 -729045992 811583872...

correct output
NO
NO
NO
NO
NO
...

user output
NO
NO
NO
NO
NO
...

Test 16

Verdict: ACCEPTED

input
200000 200000
629447384 -729045992 811583872...

correct output
NO
NO
NO
NO
NO
...

user output
NO
NO
NO
NO
NO
...