#include <bits/stdc++.h>
using namespace std;
using i = int;
const i MOD = 30013;
struct Trap { i a, b, c, d; };
struct Seg { i mx, cnt; Seg(i m=0, i c=0): mx(m), cnt(c) {} };
Seg mergeSeg(const Seg &x, const Seg &y) {
    if (x.mx > y.mx) return x;
    if (y.mx > x.mx) return y;
    if (x.mx == 0) return Seg(0, 1);
    return Seg(x.mx, (x.cnt + y.cnt) % MOD);
}
struct BITSeg {
    i n;
    vector<Seg> t;
    BITSeg(i m): n(m), t(m+1, Seg(0,1)) {}
    void update(i pos, const Seg &v) {
        for (; pos <= n; pos += pos & -pos)
            t[pos] = mergeSeg(t[pos], v);
    }
    Seg query(i pos) {
        Seg res(0,1);
        for (; pos > 0; pos -= pos & -pos)
            res = mergeSeg(res, t[pos]);
        return res;
    }
};
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    i N;
    if (!(cin >> N)) return 0;
    vector<Trap> A(N);
    vector<i> C;
    C.reserve(4 * N);
    for (i idx = 0; idx < N; idx++) {
        cin >> A[idx].a >> A[idx].b >> A[idx].c >> A[idx].d;
        C.push_back(A[idx].a);
        C.push_back(A[idx].b);
        C.push_back(A[idx].c);
        C.push_back(A[idx].d);
    }
    sort(C.begin(), C.end());
    C.erase(unique(C.begin(), C.end()), C.end());
    auto id = [&](i v) {
        return (i)(lower_bound(C.begin(), C.end(), v) - C.begin() + 1);
    };
    for (i idx = 0; idx < N; idx++) {
        A[idx].a = id(A[idx].a);
        A[idx].b = id(A[idx].b);
        A[idx].c = id(A[idx].c);
        A[idx].d = id(A[idx].d);
    }
    sort(A.begin(), A.end(), [](const Trap &x, const Trap &y) {
        return x.a < y.a;
    });
    i M = C.size();
    vector<i> orderB(N);
    for (i idx = 0; idx < N; idx++) orderB[idx] = idx;
    sort(orderB.begin(), orderB.end(), [&](i x, i y) {
        return A[x].b < A[y].b;
    });
    BITSeg bit(M);
    vector<Seg> dp(N);
    i ptrB = 0;
    for (i idx = 0; idx < N; idx++) {
        while (ptrB < N && A[orderB[ptrB]].b < A[idx].a) {
            i j = orderB[ptrB++];
            bit.update(A[j].d, dp[j]);
        }
        Seg best = bit.query(A[idx].c - 1);
        dp[idx] = Seg(best.mx + 1, best.cnt);
    }
    i K = 0;
    for (i idx = 0; idx < N; idx++)
        K = max(K, dp[idx].mx);
    i total = 0;
    for (i idx = 0; idx < N; idx++)
        if (dp[idx].mx == K)
            total = (total + dp[idx].cnt) % MOD;
    cout << K << " " << total;
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |