#include<bits/stdc++.h>
#define TIME (1.0* clock()/CLOCKS_PER_SEC)
#define pb push_back
#define eb emplace_back
#define id1 (id<<1)
#define id2 (id<<1)|1
#define ll long long
#define ii pair<int,int>
#define vi vector<int>
#define vii vector<pair<int,int>>
#define vl vector<long long>
#define vll vector <pair<ll,ll>>
#define li pair<long long,int>
#define vil vector <pair<int,ll>>
#define db double
#define ff first
#define ss second
#define lb lower_bound
#define ub upper_bound
#define FOR(i, a, b) for (int i = (a); i <=(b); i++)
#define F0R(i, a) FOR(i, 0, a-1)
#define ROF(i, a, b) for (int i = (b); i >= (a); i--)
#define R0F(i, a) ROF(i, 0, a-1)
#define rep(a) F0R(_, a)
#define each(a, x) for (auto &a : x)
#define ALL(x) (x).begin(),(x).end()
#define pq priority_queue <li, vector <li>, greater <li>>
using namespace std;
const int maxn=6e5+5;
const int MAXQ=3e5+5;
//const int MOD=1e9+7;
//const int MOD=998244353;
//const int dx[4]{1, 0, -1, 0}, dy[4]{0, 1, 0, -1};
#define int long long
int n = 300000;
int q;
ll ans=0;
struct DSU {
vi parent;
vl cntX, cntY;
vii history;
DSU(int size) {
parent.resize(size + 1);
cntX.resize(size + 1, 0);
cntY.resize(size + 1, 0);
FOR(i,1,n) {
parent[i] = i;
cntX[i] = 1;
cntY[i] = 0;
}
FOR(i,n+1,2*n) {
parent[i] = i;
cntX[i] = 0;
cntY[i] = 1;
}
}
int find(int x) {
while (parent[x] != x) x = parent[x];
return x;
}
bool unite(int x, int y) {
x = find(x);
y = find(y);
if (x == y) return false;
if (cntX[x] + cntY[x] < cntX[y] + cntY[y]) {
swap(x, y);
}
history.pb({x, y});
ans -= cntX[x] * cntY[x] + cntX[y] * cntY[y];
cntX[x] += cntX[y];
cntY[x] += cntY[y];
parent[y] = x;
ans += cntX[x] * cntY[x];
return true;
}
void rollback(int checkpoint) {
while ((int)history.size() > checkpoint) {
auto [x, y] = history.back();
history.pop_back();
ans -= cntX[x] * cntY[x];
cntX[x] -= cntX[y];
cntY[x] -= cntY[y];
parent[y] = y;
ans += cntX[x] * cntY[x] + cntX[y] * cntY[y];
}
}
int getCheckpoint() {
return history.size();
}
};
vector<ii> st[4 * MAXQ];
void addEdge(int id, int l, int r, int u, int v, ii edge) {
if (u > r || v < l) return;
if (u <= l && r <= v) {
st[id].pb(edge);
return;
}
int mid = (l + r) >> 1;
addEdge(id1, l, mid, u, v, edge);
addEdge(id2, mid+1, r, u, v, edge);
}
void solve(int id, int l, int r, DSU &dsu) {
int checkpoint = dsu.getCheckpoint();
for (auto &edge : st[id]) {
dsu.unite(edge.ff, edge.ss);
}
if (l == r) {
cout << ans << " ";
} else {
int mid = (l + r) >> 1;
solve(id1, l, mid, dsu);
solve(id2, mid+1, r, dsu);
}
dsu.rollback(checkpoint);
}
void solve(){
cin >> q;
FOR(i,0,4*(q+1)) st[i].clear();
map<ii, int> startTime;
DSU dsu(maxn);
FOR(i,1,q) {
int x, y;
cin >> x >> y;
ii point = {x, y + n};
if (startTime.count(point)) {
addEdge(1, 1, q, startTime[point], i - 1, point);
startTime.erase(point);
} else {
startTime[point] = i;
}
}
for (auto &[point, start] : startTime) {
addEdge(1, 1, q, start, q, point);
}
solve(1, 1, q, dsu);
cout << endl;
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
if (fopen("TASK.INP", "r")){
freopen("TASK.INP", "r", stdin);
freopen("TASK.OUT", "w", stdout);
}
int ntest;
ntest=1;
//cin>>ntest;
FOR(i,1,ntest) solve();
cerr<<"\n"<<"Time elapsed "<<TIME<<"s.\n";
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBUSU1FICgxLjAqIGNsb2NrKCkvQ0xPQ0tTX1BFUl9TRUMpCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgZWIgZW1wbGFjZV9iYWNrCiNkZWZpbmUgaWQxIChpZDw8MSkKI2RlZmluZSBpZDIgKGlkPDwxKXwxCiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgaWkgcGFpcjxpbnQsaW50PgojZGVmaW5lIHZpIHZlY3RvcjxpbnQ+CiNkZWZpbmUgdmlpIHZlY3RvcjxwYWlyPGludCxpbnQ+PiAKI2RlZmluZSB2bCB2ZWN0b3I8bG9uZyBsb25nPgojZGVmaW5lIHZsbCB2ZWN0b3IgPHBhaXI8bGwsbGw+PgojZGVmaW5lIGxpIHBhaXI8bG9uZyBsb25nLGludD4KI2RlZmluZSB2aWwgdmVjdG9yIDxwYWlyPGludCxsbD4+CiNkZWZpbmUgZGIgZG91YmxlCiNkZWZpbmUgZmYgZmlyc3QKI2RlZmluZSBzcyBzZWNvbmQKI2RlZmluZSBsYiBsb3dlcl9ib3VuZAojZGVmaW5lIHViIHVwcGVyX2JvdW5kCiNkZWZpbmUgRk9SKGksIGEsIGIpIGZvciAoaW50IGkgPSAoYSk7IGkgPD0oYik7IGkrKykKI2RlZmluZSBGMFIoaSwgYSkgRk9SKGksIDAsIGEtMSkKI2RlZmluZSBST0YoaSwgYSwgYikgZm9yIChpbnQgaSA9IChiKTsgaSA+PSAoYSk7IGktLSkKI2RlZmluZSBSMEYoaSwgYSkgUk9GKGksIDAsIGEtMSkKI2RlZmluZSByZXAoYSkgRjBSKF8sIGEpCiNkZWZpbmUgZWFjaChhLCB4KSBmb3IgKGF1dG8gJmEgOiB4KQojZGVmaW5lIEFMTCh4KSAoeCkuYmVnaW4oKSwoeCkuZW5kKCkKI2RlZmluZSBwcSBwcmlvcml0eV9xdWV1ZSA8bGksIHZlY3RvciA8bGk+LCBncmVhdGVyIDxsaT4+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjb25zdCBpbnQgbWF4bj02ZTUrNTsKY29uc3QgaW50IE1BWFE9M2U1KzU7Ci8vY29uc3QgaW50IE1PRD0xZTkrNzsKLy9jb25zdCBpbnQgTU9EPTk5ODI0NDM1MzsKLy9jb25zdCBpbnQgZHhbNF17MSwgMCwgLTEsIDB9LCBkeVs0XXswLCAxLCAwLCAtMX07CiNkZWZpbmUgaW50IGxvbmcgbG9uZwoKaW50IG4gPSAzMDAwMDA7IAppbnQgcTsKbGwgYW5zPTA7CgpzdHJ1Y3QgRFNVIHsKICAgIHZpIHBhcmVudDsKICAgIHZsIGNudFgsIGNudFk7CiAgICB2aWkgaGlzdG9yeTsKICAgIAogICAgRFNVKGludCBzaXplKSB7CiAgICAgICAgcGFyZW50LnJlc2l6ZShzaXplICsgMSk7CiAgICAgICAgY250WC5yZXNpemUoc2l6ZSArIDEsIDApOwogICAgICAgIGNudFkucmVzaXplKHNpemUgKyAxLCAwKTsKICAgICAgICAKICAgICAgICBGT1IoaSwxLG4pIHsKICAgICAgICAgICAgcGFyZW50W2ldID0gaTsKICAgICAgICAgICAgY250WFtpXSA9IDE7CiAgICAgICAgICAgIGNudFlbaV0gPSAwOwogICAgICAgIH0KICAgICAgICBGT1IoaSxuKzEsMipuKSB7CiAgICAgICAgICAgIHBhcmVudFtpXSA9IGk7CiAgICAgICAgICAgIGNudFhbaV0gPSAwOwogICAgICAgICAgICBjbnRZW2ldID0gMTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGludCBmaW5kKGludCB4KSB7CiAgICAgICAgd2hpbGUgKHBhcmVudFt4XSAhPSB4KSB4ID0gcGFyZW50W3hdOwogICAgICAgIHJldHVybiB4OwogICAgfQogICAgCiAgICBib29sIHVuaXRlKGludCB4LCBpbnQgeSkgewogICAgICAgIHggPSBmaW5kKHgpOwogICAgICAgIHkgPSBmaW5kKHkpOwogICAgICAgIGlmICh4ID09IHkpIHJldHVybiBmYWxzZTsKICAgICAgICAKICAgICAgICBpZiAoY250WFt4XSArIGNudFlbeF0gPCBjbnRYW3ldICsgY250WVt5XSkgewogICAgICAgICAgICBzd2FwKHgsIHkpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBoaXN0b3J5LnBiKHt4LCB5fSk7CiAgICAgICAgCiAgICAgICAgYW5zIC09IGNudFhbeF0gKiBjbnRZW3hdICsgY250WFt5XSAqIGNudFlbeV07CiAgICAgICAgCiAgICAgICAgY250WFt4XSArPSBjbnRYW3ldOwogICAgICAgIGNudFlbeF0gKz0gY250WVt5XTsKICAgICAgICBwYXJlbnRbeV0gPSB4OwoKICAgICAgICBhbnMgKz0gY250WFt4XSAqIGNudFlbeF07CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAKICAgIHZvaWQgcm9sbGJhY2soaW50IGNoZWNrcG9pbnQpIHsKICAgICAgICB3aGlsZSAoKGludCloaXN0b3J5LnNpemUoKSA+IGNoZWNrcG9pbnQpIHsKICAgICAgICAgICAgYXV0byBbeCwgeV0gPSBoaXN0b3J5LmJhY2soKTsKICAgICAgICAgICAgaGlzdG9yeS5wb3BfYmFjaygpOwogICAgICAgICAgICAKICAgICAgICAgICAgYW5zIC09IGNudFhbeF0gKiBjbnRZW3hdOwogICAgICAgICAgICAKICAgICAgICAgICAgY250WFt4XSAtPSBjbnRYW3ldOwogICAgICAgICAgICBjbnRZW3hdIC09IGNudFlbeV07CiAgICAgICAgICAgIHBhcmVudFt5XSA9IHk7CiAgICAgICAgICAgIAogICAgICAgICAgICBhbnMgKz0gY250WFt4XSAqIGNudFlbeF0gKyBjbnRYW3ldICogY250WVt5XTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGludCBnZXRDaGVja3BvaW50KCkgewogICAgICAgIHJldHVybiBoaXN0b3J5LnNpemUoKTsKICAgIH0KfTsKCnZlY3RvcjxpaT4gc3RbNCAqIE1BWFFdOwoKdm9pZCBhZGRFZGdlKGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYsIGlpIGVkZ2UpIHsKICAgIGlmICh1ID4gciB8fCB2IDwgbCkgcmV0dXJuOwogICAgaWYgKHUgPD0gbCAmJiByIDw9IHYpIHsKICAgICAgICBzdFtpZF0ucGIoZWRnZSk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgIGFkZEVkZ2UoaWQxLCBsLCBtaWQsIHUsIHYsIGVkZ2UpOwogICAgYWRkRWRnZShpZDIsIG1pZCsxLCByLCB1LCB2LCBlZGdlKTsKfQoKdm9pZCBzb2x2ZShpbnQgaWQsIGludCBsLCBpbnQgciwgRFNVICZkc3UpIHsKICAgIGludCBjaGVja3BvaW50ID0gZHN1LmdldENoZWNrcG9pbnQoKTsKICAgIGZvciAoYXV0byAmZWRnZSA6IHN0W2lkXSkgewogICAgICAgIGRzdS51bml0ZShlZGdlLmZmLCBlZGdlLnNzKTsKICAgIH0KICAgIAogICAgaWYgKGwgPT0gcikgewogICAgICAgCiAgICAgICAgY291dCA8PCBhbnMgPDwgIiAiOwogICAgfSBlbHNlIHsKICAgICAgICBpbnQgbWlkID0gKGwgKyByKSA+PiAxOwogICAgICAgIHNvbHZlKGlkMSwgbCwgbWlkLCBkc3UpOwogICAgICAgIHNvbHZlKGlkMiwgbWlkKzEsIHIsIGRzdSk7CiAgICB9CiAgICAKICAgIAogICAgZHN1LnJvbGxiYWNrKGNoZWNrcG9pbnQpOwp9Cgp2b2lkIHNvbHZlKCl7CiAgICBjaW4gPj4gcTsKICAgIAogICAgCiAgICBGT1IoaSwwLDQqKHErMSkpIHN0W2ldLmNsZWFyKCk7CiAgICAKICAgIG1hcDxpaSwgaW50PiBzdGFydFRpbWU7CiAgICBEU1UgZHN1KG1heG4pOwogICAgCgogICAgRk9SKGksMSxxKSB7CiAgICAgICAgaW50IHgsIHk7CiAgICAgICAgY2luID4+IHggPj4geTsKICAgICAgICBpaSBwb2ludCA9IHt4LCB5ICsgbn07IAogICAgICAgIAogICAgICAgIGlmIChzdGFydFRpbWUuY291bnQocG9pbnQpKSB7CiAgICAgICAgICAgIGFkZEVkZ2UoMSwgMSwgcSwgc3RhcnRUaW1lW3BvaW50XSwgaSAtIDEsIHBvaW50KTsKICAgICAgICAgICAgc3RhcnRUaW1lLmVyYXNlKHBvaW50KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGFydFRpbWVbcG9pbnRdID0gaTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgKGF1dG8gJltwb2ludCwgc3RhcnRdIDogc3RhcnRUaW1lKSB7CiAgICAgICAgYWRkRWRnZSgxLCAxLCBxLCBzdGFydCwgcSwgcG9pbnQpOwogICAgfQogICAgc29sdmUoMSwgMSwgcSwgZHN1KTsKICAgIGNvdXQgPDwgZW5kbDsKfQoKc2lnbmVkIG1haW4oKXsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShOVUxMKTtjb3V0LnRpZShOVUxMKTsKICAgIGlmIChmb3BlbigiVEFTSy5JTlAiLCAiciIpKXsKICAgICAgICBmcmVvcGVuKCJUQVNLLklOUCIsICJyIiwgc3RkaW4pOwogICAgICAgIGZyZW9wZW4oIlRBU0suT1VUIiwgInciLCBzdGRvdXQpOwogICAgfQogICAgaW50IG50ZXN0OwogICAgbnRlc3Q9MTsKICAgIC8vY2luPj5udGVzdDsKICAgIAogICAgRk9SKGksMSxudGVzdCkgc29sdmUoKTsKICAgIGNlcnI8PCJcbiI8PCJUaW1lIGVsYXBzZWQgIjw8VElNRTw8InMuXG4iOwogICAgcmV0dXJuIDA7Cn0=