#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
#define MASK(i) (1LL << (i))
#define int long long
const int inf = 2e9;
const int mod = 3e4 + 13;
const int N = 2.5e5 + 5;
const int b = 1500;
void ckmax(int& f, int s)
{
f = (f > s ? f : s);
}
void ckmin(int& f, int s)
{
f = (f < s ? f : s);
}
bool cp(tuple<int, int, int, int> a, tuple<int, int, int, int> b)
{
return get<1>(a) < get<1>(b);
}
bool cp2(tuple<int, int, int> a, tuple<int, int, int> b)
{
if (get<0>(a) == get<0>(b)) return get<1>(a) > get<1>(b);
return get<0>(a) < get<0>(b);
}
pair<int, int> st[1 << 19];
pair<int, int> operator+(pair<int, int> a, pair<int, int> b)
{
if (a.first == b.first) return {a.first, (a.second + b.second) % mod};
return max(a, b);
}
void build(int id = 1, int l = 1, int r = 1 << 18)
{
if (l == r)
{
st[id] = {0, 1};
return;
}
int mid = (l + r) >> 1;
build(id << 1, l, mid);
build(id << 1 | 1, mid + 1, r);
st[id] = st[id << 1] + st[id << 1 | 1];
}
void update(int pos, pair<int, int> val, int id = 1, int l = 1, int r = 1 << 18)
{
if (pos < l || pos > r) return;
if (l == r)
{
if (val.first == st[id].first) (st[id].second += val.second) %= mod;
else if (val.first > st[id].first) st[id] = val;
return;
}
int mid = (l + r) >> 1;
update(pos, val, id << 1, l, mid);
update(pos, val, id << 1 | 1, mid + 1, r);
st[id] = st[id << 1] + st[id << 1 | 1];
}
pair<int, int> get(int u, int v, int id = 1, int l = 1, int r = 1 << 18)
{
if (r < u || l > v) return {0, 0};
if (l >= u && r <= v) return st[id];
int mid = (l + r) >> 1;
auto gl = get(u, v, id << 1, l, mid);
auto gr = get(u, v, id << 1 | 1, mid + 1, r);
if (gl.first == gr.first) return {gl.first, (gl.second + gr.second) % mod};
return max(gl, gr);
}
void solve()
{
build();
int n;
cin >> n;
vector<tuple<int, int, int, int>> v(n);
vector<int> cc;
for (auto &[a, b, c, d] : v) cin >> a >> b >> c >> d, cc.push_back(c), cc.push_back(d);
sort(all(cc));
cc.erase(unique(all(cc)), cc.end());
auto get_pos = [&](int val)
{
return upper_bound(all(cc), val) - cc.begin();
};
for (auto &[a, b, c, d] : v)
{
c = get_pos(c);
d = get_pos(d);
}
sort(all(v), cp);
vector<tuple<int, int, int>> s;
for (int i = 0; i < n; i++)
{
auto [a, b, c, d] = v[i];
s.emplace_back(a, c, i + 1);
s.emplace_back(b, d, -(i + 1));
}
sort(all(s));
vector<pair<int, int>> u(n);
for (auto [t, b, id] : s)
{
if (id < 0)
{
id = -id - 1;
update(get<3>(v[id]), u[id]);
}
else
{
id = id - 1;
auto k = get(1, get<2>(v[id]) - 1);
k.first++;
if (k.first == 1) k.second = 1;
u[id] = k;
}
}
cout << st[1].first << ' ' << st[1].second;
}
int32_t main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int t = 1;
while (t--) solve();
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |