#include"../../template.h"template<typenameT>structDsu_2D{intn,m;vector<vector<pii>>par;vector<vector<int>>sz;Dsu_2D(){}Dsu_2D(int_n,int_m):n(_n),m(_m){par.resize(n+1,vector<pii>(m+1));sz.resize(n+1,vector<int>(m+1,1));for(inti=0;i<=n;i++){for(intj=0;j<=m;j++){par[i][j]={i,j};}}}piifind(piiv){if(v==par[v.fi][v.se]){returnv;}returnpar[v.fi][v.se]=find(par[v.fi][v.se]);}voidmerge(piia,piib){a=find(a);b=find(b);if(a==b)return;if(sz[a.fi][a.se]<sz[b.fi][b.se]){swap(a,b);}par[b.fi][b.se]=a;sz[a.fi][a.se]+=sz[b.fi][b.se];}boolsame_component(piiu,piiv){returnfind(u)==find(v);}intcomponent_size(piiu){u=find(u);returnsz[u.fi][u.se];}intmax_component(){intres=0;for(inti=0;i<n;i++){for(intj=0;j<m;j++){res=max(res,sz[i][j]);}}returnres;}boolisValid(intn,intm,piiu){returnu.fi>=0&&u.fi<n&&u.se>=0&&u.se<m;}/*----------- Paint cell and check maximum component ---------*/intTry_all_cell(vector<vector<T>>&a){intdx[4]={-1,0,0,1};intdy[4]={0,-1,1,0};intans=max_component();for(inti=0;i<n;i++){for(intj=0;j<m;j++){if(a[i][j])continue;intt=1;set<pii>s;for(intk=0;k<4;k++){piiu={i+dx[k],j+dy[k]};if(isValid(n,m,u)&&a[u.fi][u.se]){piiv=find(u);if(s.count(v))continue;t+=sz[v.fi][v.se];s.insert(v);}}ans=max(ans,t);}}returnans;}/*------------------------------------------------------------*//*-------------------- Paint all row or col ------------------*/intTry_Row(intk,vector<vector<T>>&a){intdx[2]={-1,1};intdy[2]={0,0};intres=0;set<pii>s;for(inti=0;i<m;i++){if(a[k][i]=='.')res++;if(a[k][i]=='#'){piix=find({k,i});if(s.find(x)==s.end()){res+=sz[x.fi][x.se];s.insert({x.fi,x.se});}}for(intj=0;j<2;j++){piiu={k+dx[j],i+dy[j]};if(isValid(n,m,u)&&a[u.fi][u.se]=='#'){piiv=find(u);if(s.find(v)==s.end()){s.insert(v);res+=sz[v.fi][v.se];}}}}returnres;}intTry_Col(intk,vector<vector<T>>&a){intdx[2]={0,0};intdy[2]={-1,1};intres=0;set<pii>s;for(inti=0;i<n;i++){if(a[i][k]=='.')res++;if(a[i][k]=='#'){piix=find({i,k});if(s.find(x)==s.end()){res+=sz[x.fi][x.se];s.insert({x.fi,x.se});}}for(intj=0;j<2;j++){piiu={i+dx[j],k+dy[j]};if(isValid(n,m,u)&&a[u.fi][u.se]=='#'){piiv=find(u);if(s.find(v)==s.end()){s.insert(v);res+=sz[v.fi][v.se];}}}}returnres;}/*------------------------------------------------------------*/};
#line 2 "template.h"
#include<bits/stdc++.h>usingnamespacestd;#define ll long long
#define MOD (ll)(1e9+7)
#define all(x) (x).begin(),(x).end()
#define unique(x) x.erase(unique(all(x)), x.end())
#define INF32 ((1ull<<31)-1)
#define INF64 ((1ull<<63)-1)
#define inf (ll)1e18
#define vi vector<int>
#define pii pair<int, int>
#define pll pair<ll, ll>
#define fi first
#define se second
constintmod=998244353;voidsolve();intmain(){ios_base::sync_with_stdio(false);cin.tie(NULL);// cin.exceptions(cin.failbit);// int t; cin >> t;// while(t--)solve();cerr<<"\nTime run: "<<1000*clock()/CLOCKS_PER_SEC<<"ms"<<'\n';return0;}#line 2 "DataStructure/DSU/Dsu_2D.h"
template<typenameT>structDsu_2D{intn,m;vector<vector<pii>>par;vector<vector<int>>sz;Dsu_2D(){}Dsu_2D(int_n,int_m):n(_n),m(_m){par.resize(n+1,vector<pii>(m+1));sz.resize(n+1,vector<int>(m+1,1));for(inti=0;i<=n;i++){for(intj=0;j<=m;j++){par[i][j]={i,j};}}}piifind(piiv){if(v==par[v.fi][v.se]){returnv;}returnpar[v.fi][v.se]=find(par[v.fi][v.se]);}voidmerge(piia,piib){a=find(a);b=find(b);if(a==b)return;if(sz[a.fi][a.se]<sz[b.fi][b.se]){swap(a,b);}par[b.fi][b.se]=a;sz[a.fi][a.se]+=sz[b.fi][b.se];}boolsame_component(piiu,piiv){returnfind(u)==find(v);}intcomponent_size(piiu){u=find(u);returnsz[u.fi][u.se];}intmax_component(){intres=0;for(inti=0;i<n;i++){for(intj=0;j<m;j++){res=max(res,sz[i][j]);}}returnres;}boolisValid(intn,intm,piiu){returnu.fi>=0&&u.fi<n&&u.se>=0&&u.se<m;}/*----------- Paint cell and check maximum component ---------*/intTry_all_cell(vector<vector<T>>&a){intdx[4]={-1,0,0,1};intdy[4]={0,-1,1,0};intans=max_component();for(inti=0;i<n;i++){for(intj=0;j<m;j++){if(a[i][j])continue;intt=1;set<pii>s;for(intk=0;k<4;k++){piiu={i+dx[k],j+dy[k]};if(isValid(n,m,u)&&a[u.fi][u.se]){piiv=find(u);if(s.count(v))continue;t+=sz[v.fi][v.se];s.insert(v);}}ans=max(ans,t);}}returnans;}/*------------------------------------------------------------*//*-------------------- Paint all row or col ------------------*/intTry_Row(intk,vector<vector<T>>&a){intdx[2]={-1,1};intdy[2]={0,0};intres=0;set<pii>s;for(inti=0;i<m;i++){if(a[k][i]=='.')res++;if(a[k][i]=='#'){piix=find({k,i});if(s.find(x)==s.end()){res+=sz[x.fi][x.se];s.insert({x.fi,x.se});}}for(intj=0;j<2;j++){piiu={k+dx[j],i+dy[j]};if(isValid(n,m,u)&&a[u.fi][u.se]=='#'){piiv=find(u);if(s.find(v)==s.end()){s.insert(v);res+=sz[v.fi][v.se];}}}}returnres;}intTry_Col(intk,vector<vector<T>>&a){intdx[2]={0,0};intdy[2]={-1,1};intres=0;set<pii>s;for(inti=0;i<n;i++){if(a[i][k]=='.')res++;if(a[i][k]=='#'){piix=find({i,k});if(s.find(x)==s.end()){res+=sz[x.fi][x.se];s.insert({x.fi,x.se});}}for(intj=0;j<2;j++){piiu={i+dx[j],k+dy[j]};if(isValid(n,m,u)&&a[u.fi][u.se]=='#'){piiv=find(u);if(s.find(v)==s.end()){s.insert(v);res+=sz[v.fi][v.se];}}}}returnres;}/*------------------------------------------------------------*/};