提交时间:2024-10-18 14:26:28

运行 ID: 33685

#include <iostream> #include <vector> using namespace std; using i64 = long long; struct Segtree { struct Node { int l, r; i64 lsum, rsum, sum, ans; int size() { return r - l + 1; } int mid() { return (l + r) >> 1; } bool in(int lo, int hi) { return lo <= l && r <= hi; } }; vector<Node> tree; vector<int> arr; Segtree(const vector<int>& nums) : tree(nums.size() << 2) , arr(nums) { build(1, nums.size()); } Node query(int l, int r, int pos = 1) { if (tree[pos].in(l, r)) return tree[pos]; int mid = tree[pos].mid(); if (r <= mid) return query(l, r, pos << 1); else if (l > mid) return query(l, r, pos << 1 | 1); else { Node ans, left(query(l, r, pos << 1)), right(query(l, r, pos << 1 | 1)); merge(ans, left, right); return ans; } } void update(int idx, int val, int pos = 1) { if (tree[pos].in(idx, idx)) { tree[pos].lsum += val; tree[pos].rsum += val; tree[pos].sum += val; tree[pos].ans += val; return; } int mid = tree[pos].mid(); if (idx <= mid) update(idx, val, pos << 1); else update(idx, val, pos << 1 | 1); merge(tree[pos], tree[pos << 1], tree[pos << 1 | 1]); } private: void merge(Node& node, const Node& left, const Node& right) { node.sum = left.sum + right.sum; node.lsum = max(left.lsum, left.sum + right.lsum); node.rsum = max(left.rsum + right.sum, right.rsum); node.ans = max(max(left.ans, right.ans), left.rsum + right.lsum); } void build(int l, int r, int pos = 1) { tree[pos] = { l, r }; if (l == r) { tree[pos].lsum = tree[pos].rsum = tree[pos].sum = tree[pos].ans = arr[l - 1]; return; } int mid = (l + r) >> 1; build(l, mid, pos << 1); build(mid + 1, r, pos << 1 | 1); merge(tree[pos], tree[pos << 1], tree[pos << 1 | 1]); } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n, q, k, d; cin >> n >> q >> k >> d; Segtree arr(vector<int>(n, -k)); while (q-- > 0) { int pos, val; cin >> pos >> val; arr.update(pos, val); cout << (arr.query(1, n).ans > (i64)k * d ? "NO\n" : "YES\n"); } return 0; }