#pragma once
// This file is a fork of AtCoder Library.#define E6NLAQ_DSU_HPP
#include<algorithm>
#include<cassert>
#include<vector>namespacee6nlaq{// Implement (union by size) + (path compression)// Reference:// Zvi Galil and Giuseppe F. Italiano,// Data structures and algorithms for disjoint set union problemsstructdsu{public:dsu():_n(0){}explicitdsu(intn):_n(n),parent_or_size(n,-1){}intmerge(inta,intb){assert(0<=a&&a<_n);assert(0<=b&&b<_n);intx=leader(a),y=leader(b);if(x==y)returnx;if(-parent_or_size[x]<-parent_or_size[y])std::swap(x,y);parent_or_size[x]+=parent_or_size[y];parent_or_size[y]=x;returnx;}boolsame(inta,intb){assert(0<=a&&a<_n);assert(0<=b&&b<_n);returnleader(a)==leader(b);}intleader(inta){assert(0<=a&&a<_n);if(parent_or_size[a]<0)returna;returnparent_or_size[a]=leader(parent_or_size[a]);}intsize(inta){assert(0<=a&&a<_n);return-parent_or_size[leader(a)];}std::vector<std::vector<int>>groups(){std::vector<int>leader_buf(_n),group_size(_n);for(inti=0;i<_n;i++){leader_buf[i]=leader(i);group_size[leader_buf[i]]++;}std::vector<std::vector<int>>result(_n);for(inti=0;i<_n;i++){result[i].reserve(group_size[i]);}for(inti=0;i<_n;i++){result[leader_buf[i]].push_back(i);}result.erase(std::remove_if(result.begin(),result.end(),[&](conststd::vector<int>&v){returnv.empty();}),result.end());returnresult;}private:int_n;// root node: -1 * component size// otherwise: parentstd::vector<int>parent_or_size;};}// namespace e6nlaq
#line 2 "include/e6nlaq/dsu.hpp"
// This file is a fork of AtCoder Library.#define E6NLAQ_DSU_HPP
#include<algorithm>
#include<cassert>
#include<vector>namespacee6nlaq{// Implement (union by size) + (path compression)// Reference:// Zvi Galil and Giuseppe F. Italiano,// Data structures and algorithms for disjoint set union problemsstructdsu{public:dsu():_n(0){}explicitdsu(intn):_n(n),parent_or_size(n,-1){}intmerge(inta,intb){assert(0<=a&&a<_n);assert(0<=b&&b<_n);intx=leader(a),y=leader(b);if(x==y)returnx;if(-parent_or_size[x]<-parent_or_size[y])std::swap(x,y);parent_or_size[x]+=parent_or_size[y];parent_or_size[y]=x;returnx;}boolsame(inta,intb){assert(0<=a&&a<_n);assert(0<=b&&b<_n);returnleader(a)==leader(b);}intleader(inta){assert(0<=a&&a<_n);if(parent_or_size[a]<0)returna;returnparent_or_size[a]=leader(parent_or_size[a]);}intsize(inta){assert(0<=a&&a<_n);return-parent_or_size[leader(a)];}std::vector<std::vector<int>>groups(){std::vector<int>leader_buf(_n),group_size(_n);for(inti=0;i<_n;i++){leader_buf[i]=leader(i);group_size[leader_buf[i]]++;}std::vector<std::vector<int>>result(_n);for(inti=0;i<_n;i++){result[i].reserve(group_size[i]);}for(inti=0;i<_n;i++){result[leader_buf[i]].push_back(i);}result.erase(std::remove_if(result.begin(),result.end(),[&](conststd::vector<int>&v){returnv.empty();}),result.end());returnresult;}private:int_n;// root node: -1 * component size// otherwise: parentstd::vector<int>parent_or_size;};}// namespace e6nlaq