Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const ll p = 1e9 + 7;
- struct seg_tree {
- vector<ll> maxs;
- vector<ll> cnt;
- seg_tree(ll n) {
- maxs.resize(4 * n, 0);
- cnt.resize(4 * n, 0ll);
- }
- pair<ll, ll> get_max(ll id, ll l, ll r, ll lq, ll rq) {
- if (lq >= r || l >= rq) {
- return {0, 0ll};
- }
- if (lq <= l && r <= rq) {
- return {maxs[id], cnt[id] % p};
- }
- ll m = (l + r) / 2;
- pair<ll, ll> m1 = get_max(id * 2 + 1, l, m, lq, rq);
- pair<ll, ll> m2 = get_max(id * 2 + 2, m, r, lq, rq);
- if (m1.fi != m2.fi) {
- return max(m1, m2);
- } else {
- return {m1.fi, (m1.se % p + m2.se % p) % p};
- }
- }
- void update(ll id, ll l, ll r, ll i, ll x, ll y) {
- if (l + 1 == r) {
- maxs[id] = x;
- cnt[id] += y % p;
- cnt[id] %= p;
- return;
- }
- ll m = (l + r) / 2;
- if (i < m) {
- update(id * 2 + 1, l, m, i, x, y);
- } else {
- update(id * 2 + 2, m, r, i, x, y);
- }
- maxs[id] = max(maxs[id * 2 + 1], maxs[id * 2 + 2]);
- if (maxs[id * 2 + 1] != maxs[id * 2 + 2]) {
- cnt[id] = (maxs[id * 2 + 1] > maxs[id * 2 + 2] ? cnt[id * 2 + 1] : cnt[id * 2 + 2]) % p;
- } else {
- cnt[id] = (cnt[id * 2 + 1] % p + cnt[id * 2 + 2] % p) % p;
- }
- }
- };
- int main() {
- ll n;
- cin >> n;
- vector<ll> a(n);
- cin >> a;
- map<ll, ll> crds;
- set<ll> b;
- for (auto el : a) {
- b.insert(el);
- }
- ll cnt = 0;
- for (auto el : b) {
- crds[el] = cnt++;
- }
- ll m = b.size();
- seg_tree s(m);
- vector<pair<ll, ll>> dp(n, {1, 1});
- s.update(0, 0, m, crds[a[0]], 1, 1);
- for (ll i = 1; i < n; ++i) {
- pair<ll, ll> ans = s.get_max(0, 0, m, 0, crds[a[i]]);
- dp[i].fi = ans.fi + 1;
- dp[i].se = max(dp[i].se, ans.se);
- s.update(0, 0, m, crds[a[i]], dp[i].fi, dp[i].se);
- }
- int d = (*max_element(all(dp))).fi;
- ll ans = 0;
- for (int i = 0; i < n; ++i) {
- if (dp[i].fi == d) ans += dp[i].se;
- ans %= p;
- }
- cout << ans % p << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement