Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define lb lower_bound
- #define vi vector<int>
- #define ii pair<int,int>
- #define fi first
- #define sc second
- const int N = 200001;
- int n, m;
- ii a[N];
- set<int> s;
- vi bit[N], node[N];
- void compress() {
- vector<int> v(s.begin(), s.end());
- for (int i = 1; i <= n; i++) {
- a[i].fi = lower_bound(v.begin(), v.end(), a[i].fi) - v.begin() + 1;
- a[i].sc = lower_bound(v.begin(), v.end(), a[i].sc) - v.begin() + 1;
- }
- }
- void fakeupd(int i, int j) {
- for (; i <= m; i += i & -i) {
- node[i].push_back(j);
- }
- }
- void fakeget(int i, int j) {
- for (; i >= 1; i -= i & -i) {
- node[i].push_back(j);
- }
- }
- void upd(int u, int v, int t) {
- for (int i = u; i <= m; i += i & -i) {
- int j = lb(node[i].begin(), node[i].end(), v) - node[i].begin();
- for (; j < (int) node[i].size(); j += j & -j) {
- bit[i][j] = max(bit[i][j], t);
- }
- }
- }
- int get(int u, int v) {
- int t = 0;
- for (int i = u; i >= 1; i -= i & -i) {
- int j = lb(node[i].begin(), node[i].end(), v) - node[i].begin();
- for (; j >= 1; j -= j & -j) {
- t = max(t, bit[i][j]);
- }
- }
- return t;
- }
- int main() {
- ios::sync_with_stdio(0); cin.tie(0);
- cin >> n;
- for (int i = 1; i <= n; i++) {
- cin >> a[i].fi >> a[i].sc;
- s.insert(a[i].fi); s.insert(a[i].sc);
- }
- compress(); m = s.size();
- for (int i = 1; i <= m; i++) {
- node[i].push_back(-1);
- }
- for (int i = 1; i <= n; i++) {
- fakeget(a[i].fi, a[i].sc);
- fakeupd(a[i].fi + 1, a[i].sc + 1);
- }
- for (int i = 1; i <= m; i++) {
- sort(node[i].begin(), node[i].end());
- bit[i].resize(node[i].size());
- }
- int ans = 0;
- for (int i = 1; i <= n; i++) {
- int t = get(a[i].fi, a[i].sc) + 1;
- upd(a[i].fi + 1, a[i].sc + 1, t);
- ans = max(ans, t);
- }
- cout << ans << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement