Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <math.h>
- #include <string>
- #include <set>
- #include <cstdio>
- #include <iomanip>
- #include <map>
- #include <stdio.h>
- #include <math.h>
- #include <queue>
- #include <random>
- #define int long long
- using namespace std;
- #define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
- int gcd(int a, int b) { return b ? a : gcd(b, a % b); }
- int toNum(char s) {
- return s - 'a';
- }
- const int inf = 1 << 31 - 1;
- const int cock = 100002;
- //#pragma GCC optimize("Ofast")
- //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
- pair<int,int> tree[ cock * 4];
- int a[100002];
- int n,k;
- void build(int v, int left, int right) {
- if (left + 1 == right)
- tree[v] = { 1,a[left] };
- else {
- int mid = (left + right) / 2;
- build(2 * v, left, mid);
- build(2 * v + 1, mid, right);
- tree[v] = { tree[2 * v].first + tree[2 * v + 1].first,min(tree[2 * v].second,tree[2 * v + 1].second )};
- }
- }
- int sum(int v, int left,int right, int l, int r) {
- if (l <= left && right <= r)
- return tree[v].first;
- if (right <= l || r <= left)
- return 0;
- int mid = (left + right) / 2;
- return sum(v * 2, left, mid, l, r) + sum(2 * v + 1, mid, right, l, r);
- }
- int min_pos(int v, int left, int right) {
- if (left + 1 == right)
- return left;
- int mid = (left + right) / 2;
- if (tree[2 * v].second == tree[v].second)
- min_pos(v * 2, left, mid);
- else
- min_pos(v * 2 + 1, mid, right);
- }
- void update(int v, int left, int right, int pos) {
- if (left + 1 == right) {
- tree[v] = { 0,inf };
- return;
- }
- int mid = (left + right) / 2;
- if (pos < mid)
- update(2 * v, left, mid, pos);
- else
- update(2 * v + 1, mid, right, pos);
- tree[v] = { tree[2 * v].first + tree[2 * v + 1].first,min(tree[2 * v].second,tree[2 * v + 1].second) };
- }
- void input() {
- cin >> n;
- for (int i = 0; i < n; i++)
- cin >> a[i];
- build(1, 0, n);
- }
- void solve() {
- int cnt = 0;
- do {
- int s = min_pos(1, 0, n);
- if (s == 0)
- cnt++;
- else
- cnt += sum(1, 0, n, 0, s);
- update(1, 0, n, s);
- } while (tree[1].first != 0);
- cout << cnt;
- }
- unsigned main() {
- //freopen("exam.in", "r", stdin);
- //freopen("exam.out", "w", stdout);
- IOS;
- input();
- solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement