Submission #1342289

#TimeUsernameProblemLanguageResultExecution timeMemory
1342289kawhietStrange Device (APIO19_strange_device)C++20
15 / 100
1052 ms589824 KiB
#include <bits/stdc++.h>
using namespace std;

#ifdef LOCAL
#include "debug.h"
#else
#define dbg(...) 47
#endif

#define int long long

constexpr int inf = 1e18;

int a, b;

struct Node {
    int lazy = 0;
    int sum = 0;
    Node *left = nullptr;
    Node *right = nullptr;
};

void push(Node *cur, int tl, int tr) {
    if (cur -> left == nullptr) cur -> left = new Node;
    if (cur -> right == nullptr) cur -> right = new Node;
    if (cur -> lazy == 0) return;
    int tm = (tl + tr) / 2;
    cur -> left -> sum = tm - tl + 1;
    cur -> left -> lazy = 1;
    cur -> right -> sum = tr - tm;
    cur -> right -> lazy = 1;
    cur -> lazy = 0;
    cur -> sum = 0;
}

void update(Node *cur, int tl, int tr, int l, int r) {
    if (r < tl || tr < l) return;
    if (l <= tl && tr <= r) {
        cur -> lazy = 1;
        cur -> sum = tr - tl + 1;
        return;
    }
    push(cur, tl, tr);
    int tm = (tl + tr) / 2;
    update(cur -> left, tl, tm, l, r);
    update(cur -> right, tm + 1, tr, l, r);
    cur -> sum = cur -> left -> sum + cur -> right -> sum;
}

int get(Node *cur, int tl, int tr, int l, int r) {
    if (r < tl || tr < l) return 0;
    if (l <= tl && tr <= r) {
        return cur -> sum;
    }
    push(cur, tl, tr);
    int tm = (tl + tr) / 1;
    return get(cur -> left, tl, tm, l, r) + get(cur -> right, tm + 1, tr, l, r);
}

Node *root;

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    cin >> n >> a >> b;
    int sum = 0;
    vector<int> l(n), r(n);
    for (int i = 0; i < n; i++) {
        cin >> l[i] >> r[i];
        sum += r[i] - l[i] + 1;
    }
    int g = gcd(a, b + 1);
    if (__int128(a) * b / g >= inf) {
        cout << sum << '\n';
        return 0;
    }
    int x = a / g * b;
    for (int i = 0; i < n; i++) {
        l[i] %= x;
        r[i] %= x;
    }
    root = new Node();
    for (int i = 0; i < n; i++) {
        if (l[i] <= r[i]) {
            update(root, 0, inf, l[i], r[i]);
        } else {
            update(root, 0, inf, l[i], x - 1);
            update(root, 0, inf, 0, r[i]);
        }
    }
    cout << get(root, 0, inf, 0, inf) << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...