#include #include #include #include #include #include #include #include using namespace std; #define mkp make_pair const int maxn=1e5+5; const int maxrc=1e6+5; int n,r,c,x[maxn],y[maxn],T[maxn],dfn[maxn],lowlink[maxn],sccno[maxn],dfs_cnt,scc_cnt,f[maxn],p[maxn],p_cnt,in[maxn],tt[maxn]; vector CR[maxrc],CC[maxrc],SR[maxrc],SC[maxrc],A[maxn],B[maxn]; map,int> hsh; stack S; void dfs(int u) { dfn[u]=lowlink[u]=++dfs_cnt; S.push(u); for(int v:A[u]) if(!dfn[v]) { dfs(v); lowlink[u]=min(lowlink[u],lowlink[v]); } else if(!sccno[v]) lowlink[u]=min(lowlink[u],dfn[v]); if(lowlink[u]==dfn[u]) { scc_cnt++; while(true) { int x=S.top(); S.pop(); sccno[x]=scc_cnt; if(x==u) break; } } } int main() { #ifdef local freopen("pro.in","r",stdin); #endif scanf("%d%d%d",&n,&r,&c); for(int i=1;i<=n;i++) { scanf("%d%d%d",&x[i],&y[i],&T[i]); hsh[mkp(x[i],y[i])]=i; if(T[i]==1) { CR[x[i]].push_back(i); SC[y[i]].push_back(i); } if(T[i]==2) { CC[y[i]].push_back(i); SR[x[i]].push_back(i); } if(T[i]==3) { SR[x[i]].push_back(i); SC[y[i]].push_back(i); } } for(int i=1;i<=r;i++) { int tot=CR[i].size(); if(tot==0) continue; int u=CR[i][0]; for(int v:SR[i]) A[u].push_back(v); if(tot==1) continue; for(int j=0;j %d\n",i,v); } //printf("\n"); for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i); for(int i=1;i<=n;i++) f[sccno[i]]++; for(int u=1;u<=n;u++) for(int v:A[u]) if(sccno[v]!=sccno[u]) B[sccno[u]].push_back(sccno[v]); for(int i=1;i<=scc_cnt;i++) { sort(B[i].begin(),B[i].end()); int len=unique(B[i].begin(),B[i].end())-B[i].begin(); B[i].resize(len); for(int v:B[i]) in[v]++; tt[i]=f[i]; } stack stk; for(int i=1;i<=scc_cnt;i++) if(!in[i]) stk.push(i); while(stk.size()) { int u=stk.top(); stk.pop(); p[++p_cnt]=u; for(int v:B[u]) { in[v]--; if(!in[v]) stk.push(v); } } int res=0; for(int i=1;i<=scc_cnt;i++) { int u=p[i]; for(int v:B[u]) f[v]=max(f[v],f[u]+tt[v]); res=max(res,f[u]); } printf("%d\n",res); return 0; }