classSolution{public:intmaximumGroups(vector<int>& g){int n = g.size();if(n==1)return1;if(n==2)return1;int ans =0, t =0;for(int i =1;1;++i){
t+=i;if(t<=n) ans++;elsebreak;}return ans;}};
classSolution{public:intclosestMeetingNode(vector<int>& e,int node1,int node2){int n = e.size();
vector<bool>b1(n),b2(n);
vector<int>l1(n,1e9),l2(n,1e9);int t =0;
b1[node1]=true;l1[node1]=0;while(node1!=-1&&t<=n){
l1[node1]=min(t++,l1[node1]);
b1[node1]=true;
node1=e[node1];}
t =0;
b2[node2]=true;l2[node2]=0;while(node2!=-1&&t<=n){
l2[node2]=min(t++,l2[node2]);
b2[node2]=true;
node2=e[node2];}
cout<<endl;int ans =-1,m=-1;
set<pair<int,int>> res;int cha =1e9;bool flag =true;for(int i =0; i < n;++i){if(b1[i]&&b2[i]){int t1 = l1[i], t2 = l2[i];
res.insert({max(t1,t2),i});
flag =false;}}if(!flag)return res.begin()->second;return-1;}};