#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
int n, r, c, low[N], dfn[N], ins[N], stk[N], top, t[N], ans, cnt, C, s[N], sz[N], ind[N], f[N];
vector<int> p[N], col[N*10], row[N*10], g[N];
map<pair<int, int>, int> mp;
pair<int, int> a[N];
queue<int> q;
void dfs(int u) {
low[u] = dfn[u] = ++cnt;
stk[++top] = u, ins[u] = 1;
for(int v : p[u]) {
if(!dfn[v]) {
dfs(v);
low[u] = min(low[u], low[v]);
}
else if(ins[v])
low[u] = min(low[u], dfn[v]);
}
if(low[u] == dfn[u]) {
++C; int v;
do {
v = stk[top--];
s[v] = C, sz[C]++;
ins[v] = 0;
} while(v != u);
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> r >> c;
for(int i = 1; i <= n; i++) {
int x, y; cin >> x >> y >> t[i];
row[x].push_back(i);
col[y].push_back(i);
mp[{x, y}] = i;
a[i] = {x, y};
}
for(int i = 1; i <= n; i++) {
if(t[i] == 1)
for(int j : row[a[i].first])
p[i].push_back(j);
if(t[i] == 2)
for(int j : col[a[i].second])
p[i].push_back(j);
if(t[i] == 3) {
int dx[] = {0, 0, 1, 1, 1, -1, -1, -1};
int dy[] = {1, -1, 0, 1, -1, 0, 1, -1};
for(int j = 0; j < 8; j++)
if(mp.count({a[i].first + dx[j], a[i].second + dy[j]}))
p[i].push_back(mp[{a[i].first + dx[j], a[i].second + dy[j]}]);
}
}
for(int i = 1; i <= n; i++)
if(!dfn[i]) dfs(i);
for(int i = 1; i <= n; i++)
for(int j : p[i])
if(s[i] != s[j])
g[s[i]].push_back(s[j]), ind[s[j]]++;
queue<int> q;
for(int i = 1; i <= C; i++)
if(!ind[i]) q.push(i), f[i] = sz[i];
while(!q.empty()) {
int u = q.front(); q.pop();
for(int v : g[u]) {
f[v] = max(f[v], f[u] + sz[v]);
if(!--ind[v]) q.push(v);
}
}
cout << *max_element(f + 1, f + C + 1) << endl;
return 0;
}
为什么过了,不是平方的吗/kel