Link to this code:
https://cses.fi/paste/196d9e00a28e60c3d3f92e/
#include <bits/stdc++.h>
using namespace std;
#define ll long long int
#define vt deque<ll>
#define pll pair<ll,ll>
#define pb push_back
#define BR break
#define CNT continue
#define NO cout<<"NO"<<endl
#define YES cout<<"YES"<<endl
#define NL cout<<endl;
#define ct(t) cout<<t<<endl
#define forn for(ll i=0;i<n;++i)
#define forx(i,x) for(ll i=0;i<x;++i)
#define fory(i,x,y) for(ll i=x;i<=y;++i)
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define inp(a,n) for(ll i=0;i<n;++i) cin>>a[i];
#define out(a,n) for(ll i=0;i<n;++i) {cout<<a[i]<<" ";} cout<<endl;
#define outmp(mp) for(auto val:mp) cout<<val.first<<" "<<val.second<<endl;
#define outst(s) for(auto val:s) {cout<<val<<" ";} NL;
const ll MOD = 1e9+7;
vector<ll> tree;
ll n;
void update(ll node, ll start, ll end, ll idx, ll val) {
if (start == end) {
tree[node] = (tree[node] + val) % MOD;
return;
}
ll mid = (start + end) / 2;
if (idx <= mid) update(node * 2, start, mid, idx, val);
else update(node * 2 + 1, mid + 1, end, idx, val);
tree[node] = (tree[node * 2] + tree[node * 2 + 1]) % MOD;
}
ll query(ll node, ll start, ll end, ll l, ll r) {
if (r < start || end < l) return 0;
if (l <= start && end <= r) return tree[node];
ll mid = (start + end) / 2;
return (query(node * 2, start, mid, l, r) +
query(node * 2 + 1, mid + 1, end, l, r)) % MOD;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
vt arr(n);
inp(arr, n);
vt comp = arr;
sort(all(comp));
comp.erase(unique(all(comp)), comp.end());
map<ll, vector<ll>> pos;
forn pos[arr[i]].pb(i);
tree.assign(4 * n, 0);
ll ans = 0;
for (auto &p : pos) {
vector<ll> updates;
for (auto idx : p.second) {
ll compressedIdx = idx + 1;
ll cnt = query(1, 1, n, 1, compressedIdx - 1);
ll val = (cnt + 1) % MOD;
updates.pb(val);
}
for (ll k = 0; k < p.second.size(); k++) {
ll idx = p.second[k] + 1;
update(1, 1, n, idx, updates[k]);
ans = (ans + updates[k]) % MOD;
}
}
ct(ans);
return 0;
}