1 #include<cstdio>
2 #include<cstring>
3 using namespace std;
4 int n,m,flag=1,cnt;
5 int a,b,x,y,c;
6 int movee[4][2]={-1,0,1,0,0,-1,0,1};
7 int p[505][505];
8 int f[250050];//存点
9 int find(int x){
10 if(f[x]==x)
11 return x;
12 else{
13 f[x]=find(f[x]);
14 return f[x];
15 }
16 }
17 int main(){
18 scanf("%d%d",&n,&m);
19 memset(p,-1,sizeof(p));
20 for(int i=1;i<=n*n;i++)
21 f[i]=i;
22 for(int i=1;i<=m;i++){
23 scanf("%d%d%d",&c,&x,&y);
24 p[x][y]=c;
25 flag=1;
26 for(int j=0;j<4;j++)
27 {
28 int x1=x+movee[j][0],y1=y+movee[j][1];//左右上下找
29 if(x1>0&&y1>0&&x1<=n&&y1<=n&&p[x][y]==p[x1][y1])
30 {//合法且颜色相同
31 a=find((x1-1)*n+y1);//旁边点找出的爹
32 b=find((x-1)*n+y);//本来的爹(都是把二维转化成一维)
33 if(a!=b&&flag)
34 {
35 f[b]=a;
36 flag=0;//已经连上
37 }
38 else if(a!=b&&!flag)
39 {
40 cnt--;
41 f[a]=f[b];
42 }
43 }
44 if(j==3&&flag)
45 {
46 cnt++;
47 }//这层一定要放在外面
48 }
49 printf("%d\n",cnt);
50 }
51 return 0;
52 }