Advertisement
ivnikkk

Untitled

Jan 27th, 2022
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.11 KB | None | 0 0
  1. #pragma GCC optimize("03")
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include "bits/stdc++.h"
  4. using namespace std;
  5. using namespace chrono;
  6. #define all(a) a.begin(), a.end()
  7. #define allr(a) a.rbegin(), a.rend()
  8. #define endl "\n"
  9. #define fast_io ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  10. mt19937 rnd(std::chrono::high_resolution_clock::now().time_since_epoch().count());
  11. typedef int ll;
  12. typedef long double ld;
  13. struct Tree {
  14.     vector<ll> tree,mod;
  15.     map<ll, ll> posit;
  16.     void init(ll n) {
  17.         tree.resize(4*n,0);
  18.         mod.resize(4 * n,-1);
  19.     }
  20.     void push(ll v) {
  21.         if (mod[v] == -1)return;
  22.          tree[v] = 0;
  23.         if (v * 2 + 1 > (ll)tree.size()) {
  24.             mod[v] = -1;
  25.             return;
  26.         }
  27.         mod[v * 2] = mod[v];
  28.         mod[v * 2 + 1] = mod[v];
  29.         mod[v] = -1;
  30.     }
  31.     void update(ll v, ll tl, ll tr, ll pos) {
  32.         if (tl == tr) {
  33.             posit[tl] = v;
  34.             tree[v]++;
  35.             return;
  36.         }
  37.         ll mid = (tl + tr) / 2;
  38.         if (pos <= mid) {
  39.             update(v * 2, tl, mid, pos);
  40.         }
  41.         else {
  42.             update(v * 2 + 1, mid + 1, tr, pos);
  43.         }
  44.         tree[v] = tree[v * 2] + tree[v * 2 + 1];
  45.     }
  46.     ll get_sum(ll v, ll tl, ll tr, ll l, ll r) {
  47.         push(v);
  48.         if (tl > r || tr < l) {
  49.             return 0;
  50.         }
  51.         if (tl >= l && tr <= r) {
  52.             return tree[v];
  53.         }
  54.         ll mid = (tl + tr) / 2;
  55.         return get_sum(v * 2, tl, mid, l, r) + get_sum(v * 2 + 1, mid + 1, tr, l, r);
  56.     }
  57.     void update_sum(ll v, ll tl, ll tr, ll l, ll r) {
  58.         push(v);
  59.         if (tl > r || tr < l) {
  60.             return;
  61.         }
  62.         if (tl >= l && tr <= r) {
  63.             mod[v]=0;
  64.             push(v);
  65.             return;
  66.         }
  67.         ll mid = (tl + tr) / 2;
  68.         update_sum(v * 2, tl, mid, l, r);
  69.         update_sum(v * 2 + 1, mid + 1, tr, l, r);
  70.         tree[v] = tree[v * 2] + tree[v * 2 + 1];
  71.     }
  72.     bool get(ll v, ll tl, ll tr, ll pos) {
  73.         push(v);
  74.         if (tl == tr) {
  75.             return tree[v]>0;
  76.         }
  77.         ll mid = (tl + tr) / 2;
  78.         if (pos <= mid) {
  79.             get(v * 2, tl, mid, pos);
  80.         }
  81.         else {
  82.             get(v * 2 + 1, mid + 1, tr, pos);
  83.         }
  84.     }
  85. };
  86. signed main() {
  87. #ifdef _DEBUG
  88.     freopen("input.txt", "r", stdin);
  89.     freopen("output.txt", "w", stdout);
  90. #endif
  91.     srand(time(NULL));
  92.     ll t = 1;
  93.     //cin >> t;
  94.     while (t--) {
  95.         ll n;
  96.         cin >> n;
  97.         vector<ll> a(n);
  98.         struct My {
  99.             ll inf = 1e9;
  100.             ll mn=inf, mx=-1;
  101.         };
  102.         map<ll, ll>cur,pos;
  103.         vector<My> cnt(n+1);
  104.         for (ll i = 0; i < n; i++) {
  105.             cin >> a[i];
  106.             cnt[a[i]].mn = min(cnt[a[i]].mn, i);
  107.             cnt[a[i]].mx = max(cnt[a[i]].mx, i);
  108.             cur[a[i]]++,pos[a[i]]=i;
  109.         }
  110.         Tree seg,seg2;
  111.         seg.init(n);
  112.         seg2.init(n);
  113.         for (ll i = 0; i < n; i++) {
  114.             if (cur[a[i]] == 1 || i != cnt[a[i]].mn && i != cnt[a[i]].mx) {
  115.                 seg.update(1, 0, n - 1, i);
  116.             }
  117.             else {
  118.                 seg2.update(1, 0, n - 1, i);
  119.             }
  120.         }
  121.         ll ans = 0;
  122.         struct Cur {
  123.             ll l, r;
  124.         };
  125.         vector<Cur>d;
  126.         for (auto& i : cur) {
  127.  
  128.             if (i.second == 1) {
  129.             }
  130.             else {
  131.                 d.push_back({ cnt[i.first].mn, cnt[i.first].mx });
  132.                 ans += seg.get_sum(1, 0, n - 1, cnt[i.first].mn+1, cnt[i.first].mx-1);
  133.                 seg.update_sum(1, 0, n - 1, cnt[i.first].mn+1, cnt[i.first].mx-1);
  134.             }
  135.         }
  136.         auto cmp = [&](Cur l, Cur r) {
  137.             return l.l < r.l;
  138.         };
  139.         sort(all(d), cmp);
  140.         for (Cur i : d) {
  141.             if (seg2.get(1, 0, n - 1, i.l))
  142.                if( seg2.get(1, 0, n - 1, i.r)) {
  143.                 ans += seg2.get_sum(1, 0, n - 1, i.l+1, i.r-1);
  144.                 seg2.update_sum(1, 0, n - 1, i.l+1, i.r-1);
  145.             }
  146.         }
  147.         cout << ans << endl;
  148.     }
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement