#include <bits/stdc++.h>
using namespace std;
int d, n, m, h[1000005], fa[100005], f[100005], siz[100005], s[1000005];
unordered_map <int, int> mp;
vector <int> g[1000005];
int id (int i, int x) { return (i - 1) * n + x; }
int find (int x) { return fa[x] == x ? x : fa[x] = find (fa[x]); }
mt19937 rnd (114514);
int ans = 0;
void calc (int x, int delta) {
ans -= mp[x] * mp[x];
mp[x] += delta;
ans += mp[x] * mp[x];
}
void merge (int a, int b) {
a = find (a), b = find (b);
if (a == b) return ;
if (siz[a] > siz[b]) swap (a, b);
for (auto i : g[a]) {
g[b].emplace_back (i);
int v = i % n + 1;
calc (s[v], -1);
s[v] = s[v] - h[a] + h[b];
calc (s[v], 1);
}
fa[a] = b; siz[b] += siz[a];
}
int main () {
cin >> d >> n >> m;
for (int j = 1; j <= n; j ++) {
for (int i = 1; i <= d; i ++) {
h[id (i, j)] = rnd (), s[j] += h[id (i, j)];
g[id (i, j)].emplace_back (id (i, j));
fa[id (i, j)] = id (i, j); siz[id (i, j)] = 1;
}
calc (s[j], 1);
}
while (m --) {
int a, b, k; cin >> a >> b >> k;
merge (id (k, a), id (k, b));
cout << ans << "\n";
}
}