#include using namespace std; int n; class PersistentSegmentTree { public: struct noduri { int st, dr, Sum; }; vector radacina; vector arbore; int nodes; void Start() { radacina.resize (n+2); arbore.resize (n<<4); nodes = 0; } int copy_node (int nod) { ++nodes; arbore[nodes] = arbore[nod]; return nodes; } int modul (int x) { if (x<0) return -x; return x; } int adauga_val (int nod, int st, int dr, int val, int poz) { nod = copy_node(nod); if (st == dr) { arbore[nod].Sum += val; return nod; } int mijloc = (st+dr)>>1; if (poz<=mijloc) arbore[nod].st = adauga_val (arbore[nod].st, st, mijloc, val, poz); else arbore[nod].dr = adauga_val(arbore[nod].dr, mijloc+1, dr, val, poz); arbore[nod].Sum = arbore[arbore[nod].st].Sum+arbore[arbore[nod].dr].Sum; return nod; } int Sum_Query (int nod1, int nod2, int st, int dr, int a, int b) { if (a<=st && dr<=b) { return modul(arbore[nod2].Sum-arbore[nod1].Sum); } int mijloc = (st+dr)>>1; int Sum_left = 0; int Sum_right = 0; if (a<=mijloc) Sum_left = Sum_Query(arbore[nod1].st, arbore[nod2].st, st, mijloc, a, b); if (b>mijloc) Sum_right = Sum_Query(arbore[nod1].dr, arbore[nod2].dr, mijloc+1, dr, a, b); return Sum_left+Sum_right; } } Arb; int prima_pozitie[50001]; int a_doua_poz[50001]; int main() { cin >> n; n<<=1; Arb.Start(); n>>=1; for (int i = 1; i<=2*n; ++i) { int x; cin >> x; if (prima_pozitie[x] == 0) { prima_pozitie[x] = i; Arb.radacina[i] = Arb.adauga_val(Arb.radacina[i-1], 1, n, 1, x); } else { a_doua_poz[x] = i; Arb.radacina[i] = Arb.adauga_val(Arb.radacina[i-1], 1, n, -1, x); } } int raspuns = 0; for (int i = 1; i<=n; ++i) raspuns+=Arb.Sum_Query(Arb.radacina[prima_pozitie[i]-1], Arb.radacina[a_doua_poz[i]], 1, n, 1, n); cout << raspuns/2; return 0; }