DMOJ · ccc26s2

CCC 2026 S2 Beams of Light

This C++ solution uses prefix sums for CCC 2026 S2 Beams of Light. Read the reasoning, inspect the code, or try your own test case below.

ccc26s2CCC 2026 S2Graphs & treesPrefix sumsC++57 lines
Solution028of 248
Open official problem ↗ Download C++ file ↓ Search the library → Open full Code Lab ↗ Report an issue ↗

Approach

Prefix sums

Beams of Light has N parking spots, light positions/spreads, and Y/N illumination queries; the code uses the matching interval coverage difference array.

Graphs & trees

Problem and code

Useful links.

Written by benbenyaojifen. Try the problem first, then compare your approach with the code.

Open official problem ↗View exact source file ↗
Implementation

S_2_Beams_of_Light.cpp

C++

    #include <bits/stdc++.h>
    using namespace std;
    using ll = long long;
    using i128 = __int128;
    const int inf = 1e9;
    const ll INF = 1e17;
    void solve1() {
        int n, l, q; cin >> n >> l >> q;
        vector<int> diff(n + 2);
        for (int i = 0; i < l; i++) {
            int a, b; cin >> a >> b;
            diff[max(1, a - b)]++;
            diff[min(n + 1, a + b + 1)]--;
        }
        for (int i = 1; i <= n; i++) diff[i] += diff[i - 1];
        for (int i  = 0; i < q; i++) {
            int x; cin >> x;
            cout << (diff[x] ? "Y": "N") << '\n';
        }
    }
    void solve2() {
        int n, l, q; cin >> n >> l >> q;
        vector<pair<int, int>> seg;
        for (int i = 0; i < l; i++) {
            int a, b; cin >> a >> b;
            seg.emplace_back(max(1, a - b), min(n, a + b));
        }
        sort(seg.begin(), seg.end());
        vector<pair<int, int>> ss;
        for (int i = 0, j = 0; i < seg.size(); i++) {
            auto[a, b] = seg[i];
            j = i + 1;
            while (j < seg.size() && seg[j].first <= b) {
                b = max(b, seg[j].second);
                j++;
            }
            i = j - 1;
            ss.emplace_back(a, b);
        }
        for (int i = 0; i < q; i++) {
            int x; cin >> x;
            pair p = {x, inf};
            int pos = upper_bound(ss.begin(), ss.end(), p) - ss.begin();
            pos = max(0, pos - 1);
            auto[a, b] = ss[pos];
            if (x >= a && x <= b) {
                cout << "Y" << '\n';
            } else {
                cout << "N" << '\n';
            }
        }
    }
    int main() {
        ios::sync_with_stdio(0); cin.tie(0);
        solve1();
        return 0;
    }
        

Did this explanation save you time? I'm a Grade 11 student building this free library to make difficult algorithms easier to understand.

Buy me a coffee ↗Keep studying →

Test this problem

Run your code here.

Paste your code, run a test case, compare the output, or trace selected values.

Full trace, comparison & stress testing ↗
StatusReady
Output
No run yet.
Diagnostics
No diagnostics yet.

Each run is isolated and has strict limits. Passing one test does not guarantee the judge will accept the solution.