Submission #284336

#TimeUsernameProblemLanguageResultExecution timeMemory
284336Alexa2001Matryoshka (JOI16_matryoshka)C++17
100 / 100
341 ms16368 KiB
#include <bits/stdc++.h>

using namespace std;

const int Nmax = 2e5 + 5;

int A[Nmax], B[Nmax], C[Nmax], D[Nmax], ans[Nmax];
vector<int> as;

int n, q;


class AIB
{
    int a[Nmax];

    int ub(int x)
    {
        return (x&(-x));
    }

public:
    int query(int x)
    {
        x = lower_bound(as.begin(), as.end(), x) - as.begin() + 1;

        int ans = 0;
        for(; x<=n; x+=ub(x))
            ans = max(ans, a[x]);
        return ans;
    }

    void update(int pos, int val)
    {
        pos = lower_bound(as.begin(), as.end(), pos) - as.begin() + 1;

        for(; pos; pos-=ub(pos))
            a[pos] = max(a[pos], val);
    }
} aib;

void add(int x)
{
    int res = aib.query(x);
    aib.update(x, res+1);
}

int main()
{
  //  freopen("input", "r", stdin);
    cin.tie(0); cin.sync_with_stdio(false);

    cin >> n >> q;

    int i;

    for(i=1; i<=n; ++i) cin >> A[i] >> B[i];
    for(i=1; i<=q; ++i) cin >> C[i] >> D[i];

    vector<int> ord1(n), ord2(q);
    iota(ord1.begin(), ord1.end(), 1);
    iota(ord2.begin(), ord2.end(), 1);

    sort(ord1.begin(), ord1.end(), [] (int x, int y) { if(B[x] == B[y]) return A[x] > A[y]; return B[x] < B[y]; } );
    sort(ord2.begin(), ord2.end(), [] (int x, int y) { return D[x] < D[y]; } );

    for(i=1; i<=n; ++i) as.push_back(A[i]);
    sort(as.begin(), as.end());
    as.erase( unique(as.begin(), as.end()), as.end() );

    i = 0;
    for(auto id : ord2)
    {
        while(i < n && B[ord1[i]] <= D[id])
            add(A[ord1[i]]), ++i;

        ans[id] = aib.query(C[id]);
    }

    for(i=1; i<=q; ++i) cout << ans[i] << '\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...