Submission #1171774

#TimeUsernameProblemLanguageResultExecution timeMemory
1171774Hanksburgertrapezoid (balkan11_trapezoid)C++20
100 / 100
114 ms16032 KiB
#include <bits/stdc++.h>
using namespace std;
vector<pair<pair<int, int>, pair<int, int> > > rect;
pair<int, int> bit[200005], ans[100005], ANS;
vector<pair<pair<int, int>, int> > event;
map<int, int> mp;
int n, cnt;
pair<int, int> merge(pair<int, int> x, pair<int, int> y)
{
    if (x.first!=y.first)
        return x.first>y.first?x:y;
    return {x.first, (x.second+y.second)%30013};
}
void upd(int x, pair<int, int> y)
{
    for (int i=x; i<=cnt; i+=i&(-i))
        bit[i]=merge(bit[i], y);
}
pair<int, int> qry(int x)
{
    pair<int, int> res={0, 0};
    for (int i=x; i; i-=i&(-i))
        res=merge(res, bit[i]);
    return res;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    mp[0]=1;
    for (int i=0; i<n; i++)
    {
        int a, b, c, d;
        cin >> a >> b >> c >> d;
        rect.push_back({{a, b}, {c, d}});
        event.push_back({{a, 1}, i});
        event.push_back({{b, 0}, i});
        mp[c]=mp[d]=1;
    }
    for (auto it=mp.begin(); it!=mp.end(); it++)
        it->second=(++cnt);
    upd(1, {0, 1});
    sort(event.begin(), event.end());
    for (int i=0; i<event.size(); i++)
    {
        int ind=event[i].second;
        if (event[i].first.second)
        {
            ans[ind]=qry(mp[rect[ind].second.first]-1);
            ans[ind].first++;
            ANS=merge(ANS, ans[ind]);
        }
        else
            upd(mp[rect[ind].second.second], ans[ind]);
    }
    cout << ANS.first << ' ' << ANS.second;
}
#Verdict Execution timeMemoryGrader output
Fetching results...