Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int n;
- int a[100010],fen[100010];
- pair<int,int> b[100010];
- vector < pair<int,int> > query;
- int find_upper(int val)
- {
- int l = 1, r = n, mid = 0, id = -1;
- while (l <= r)
- {
- mid = (l + r) / 2;
- if (val > b[mid].first){
- id = mid;
- l = mid + 1;
- }
- else r = mid - 1;
- }
- return id;
- }
- void update(int p)
- {
- for (int i = p; i <= n; i += i & -i)
- fen[i] += 1;
- }
- long long count_pos(int p)
- {
- long long cnt = 0;
- for (int i = p; i > 0; i -= i & -i)
- cnt += fen[i];
- return cnt;
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(false);
- freopen("test.inp", "r", stdin);
- scanf("%d", &n);
- for (int i = 1; i <= n; i++)
- {
- scanf("%d", &a[i]);
- b[i] = {-a[i],i};
- }
- sort(b + 1, b + n + 1);
- for (int i = 1; i <= n; i++)
- {
- int j = find_upper(a[i]);
- if (j != -1)
- query.push_back({j,i});
- }
- sort(query.begin(), query.end(), greater< pair<int,int> >());
- long long res = 0;
- for (int i = 1; i <= n; i++)
- {
- if (-b[i].first >= 0) res -= i - 1;
- update(b[i].second);
- while (i == query.back().first)
- {
- if (query.back().second - 1 > 0)
- res += count_pos(query.back().second);
- query.pop_back();
- }
- }
- cout << res;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement