import sequtils,queues proc getchar_unlocked():char {. importc:"getchar_unlocked",header: "" .} proc scan(): int = while true: let k = getchar_unlocked() if k < '0': break result = 10 * result + k.ord - '0'.ord type UnionFind = object parent : seq[int32] rank : seq[int32] proc root(self:var UnionFind,x:int32): int32 = if self.parent[x] == x: return x self.parent[x] = self.root(self.parent[x]) return self.parent[x] proc initUnionFind(size:int32) : UnionFind = result.parent = newSeqUninitialized[int32](size) result.rank = newSeq[int32](size) for i in 0.int32.. 0 and uf.parent[i-1] != 0: uf.unite(i,i-1) if y > 0 and uf.parent[i-w] != 0: uf.unite(i,i-w) else: uf.parent[i] = 0 discard getchar_unlocked() i += 1 var ans = 0 for i in 1..h*w: if uf.root(i) == i : ans += 1 echo ans # let h = scan() # let w = scan() # var isWater : array[3001,array[3001,bool]] # for y in 0.. 0: # let x = X.dequeue() # let y = Y.dequeue() # template regist(nx,ny:int32) = # if isWater[nx][ny] : # X.enqueue(nx) # Y.enqueue(ny) # isWater[nx][ny] = false # if x > 0: regist(x-1,y) # if y > 0: regist(x,y-1) # if x < w-1: regist(x+1,y) # if y < h-1: regist(x,y+1) # var ans = 0 # for x in 0.int3232..