Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <vector>
- #include <algorithm>
- using namespace std;
- vector<pair<long long, long long>> t;
- const long long MOD = 1000 * 1000 * 1000 + 7;
- void recalc(long long v)
- {
- if(t[v * 2].first > t[v * 2 + 1].first)
- {
- t[v] = t[v * 2];
- }
- else if(t[v * 2].first < t[v * 2 + 1].first)
- {
- t[v] = t[v * 2 + 1];
- }
- else
- {
- t[v] = {t[v * 2].first, t[v * 2].second + t[v * 2 + 1].second};
- }
- t[v].first %= MOD;
- t[v].second %= MOD;
- }
- void upd(long long v, long long l, long long r, long long L, long long R, pair<long long, long long> x)
- {
- if(l >= R || L >= r)
- {
- return;
- }
- if(L <= l && r <= R)
- {
- if(t[v].first < x.first)
- {
- t[v] = x;
- }
- else if(t[v].first == x.first)
- {
- t[v].second += x.second;
- }
- t[v].second %= MOD;
- return;
- }
- upd(v * 2, l, (l + r) / 2, L, R, x);
- upd(v * 2 + 1, (l + r) / 2, r, L, R, x);
- recalc(v);
- }
- pair<long long, long long> get(long long v, long long l, long long r, long long L, long long R)
- {
- if(l >= R || L >= r)
- {
- return {0, 0};
- }
- if(L <= l && r <= R)
- {
- return t[v];
- }
- auto x1 = get(v * 2, l, (l + r) / 2, L, R);
- auto x2 = get(v * 2 + 1, (l + r) / 2, r, L, R);
- if(x1.first > x2.first)
- {
- return {x1.first % MOD, x1.second % MOD};
- }
- if(x1.first < x2.first)
- {
- return x2;
- }
- else
- {
- return {x1.first, (x1.second + x2.second) % MOD};
- }
- }
- signed main()
- {
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- long long n;
- cin >> n;
- t.resize(4 * n);
- vector<long long> v(n);
- for(long long i = 0; i < n; ++i)
- {
- cin >> v[i];
- }
- auto p = v;
- sort(p.begin(), p.end());
- p.erase(unique(p.begin(), p.end()), p.end());
- for(long long i = 0; i < n; ++i)
- {
- long long x = v[i];
- long long pos = lower_bound(p.begin(), p.end(), x) - p.begin();
- ++pos;
- auto get1 = get(1, 0, n, 0, pos - 1);
- upd(1, 0, n, pos - 1, pos, {get1.first + 1, max(get1.second, 1LL)});
- }
- cout << get(1, 0, n, 0, n).second;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement