Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <cmath>
- #include <string>
- #include <algorithm>
- #include <map>
- #include <set>
- #include <queue>
- #include <cassert>
- using namespace std;
- #define pb push_back
- #define re return
- const int N = 1e5 + 1;
- struct node
- {
- int mx, cnt;
- };
- vector<node> t(4 * N);
- node chto(node a, node b)
- {
- if (a.mx == b.mx)
- {
- node c;
- c.mx = a.mx;
- c.cnt = a.cnt + b.cnt;
- return c;
- }
- else if(a.mx > b.mx)
- {
- return a;
- }
- else
- {
- return b;
- }
- }
- void upd(int v, int l, int r, int pos, node x)
- {
- if (pos < l || pos >= r)
- {
- return;
- }
- if (l + 1 == r && pos == l)
- {
- if (t[v].mx == x.mx)
- {
- t[v].cnt += x.cnt;
- }
- else
- {
- t[v] = x;
- }
- }
- else
- {
- int m = (l + r) / 2;
- upd(v * 2, l, m, pos, x);
- upd(v * 2 + 1, m, r, pos, x);
- t[v] = chto(t[2 * v], t[2 * v + 1]);
- }
- }
- node get(int v, int l, int r, int L, int R)
- {
- if (l >= R || L >= r)
- {
- node c;
- c.mx = 0;
- c.cnt = 0;
- return c;
- }
- if (l >= L && r <= R)
- {
- return t[v];
- }
- int m = (l + r) / 2;
- return chto(get(v * 2, l, m, L, R), get(v * 2 + 1, m, r, L, R));
- }
- bool comp(pair<int, int> a, pair<int, int> b)
- {
- return a.first < b.first;
- }
- int main()
- {
- int n;
- cin >> n;
- vector<pair<int, int>> v(n);
- for (int i = 0; i < n; ++i)
- {
- cin >> v[i].first;
- v[i].second = i;
- }
- vector<pair<int, int>> v2 = v;
- sort(v2.begin(), v2.end(), comp);
- int now = 1;
- v[v2[0].second].first = now;
- for (int i = 1; i < n; ++i)
- {
- if (v2[i].first == v2[i - 1].first)
- {
- v[v2[i].second].first = now;
- }
- else
- {
- ++now;
- v[v2[i].second].first = now;
- }
- }
- for (int i = 0; i < n; ++i)
- {
- node ans = get(1, 0, N, 1, v[i].first);
- ans.mx += 1;
- ans.cnt = max(ans.cnt, 1);
- upd(1, 0, N, v[i].first, ans);
- }
- cout << t[1].cnt << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement