import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.util.ArrayDeque; import java.util.Arrays; import java.util.HashSet; import java.util.NoSuchElementException; import java.util.Queue; import java.util.Set; class DJSet{ int n; int[] upper; public DJSet(int n) { this.n=n; upper=new int[n]; Arrays.fill(upper, -1); } int root(int x) { return upper[x]<0?x:(upper[x]=root(upper[x])); } boolean equiv(int x,int y) { return root(x)==root(y); } void setUnion(int x,int y) { x=root(x);y=root(y); if(x==y)return; if(upper[x][] set=new HashSet[H*W]; for(int i=0;i(); } } for(int i=0;i=H||nw>=W)continue; if(c[cur]==c[nxt])ds.setUnion(cur, nxt); } } } for(int i=0;i=H||nw>=W)continue; if(c[cur]!=c[nxt]) { set[ds.root(cur)].add(ds.root(nxt)); set[ds.root(nxt)].add(ds.root(cur)); } } } } int Q=sc.nextInt(); for(int q=0;q around=new ArrayDeque<>(); for(int v:set[cur]) { v=ds.root(v); if(c[v]==x) { around.add(v); } } for(int v:around) { v=ds.root(v); set[cur].addAll(set[v]); set[cur].remove(cur); int pre=cur; ds.setUnion(v, cur); if(pre!=ds.root(cur)) { set[ds.root(cur)]=set[cur]; cur=ds.root(cur); } } } } for(int i=0;i Integer.MAX_VALUE) throw new NumberFormatException(); return (int) nl; } public double nextDouble() { return Double.parseDouble(next());} }