#include <iostream>
#include <bits/stdc++.h>
using namespace std;
class DSU
{
public :
int n;
vector<int> sz;
vector<int> parent;
DSU (int num)
{
n= num;
sz.resize(num+1,1);
parent.resize(num+1,1);
for(int i=0;i<=num;i++)
{
parent[i]=i;
}
}
int findParent (int x)
{
if(x==parent[x])
return x;
else
{
return parent[x]= findParent(parent[x]);
}
}
void unite(int x,int y)
{
int parentX = findParent(x);
int parentY = findParent(y);
if(sz[parentX] > sz [parentY])
{
parent[parentY]= parentX;
sz[parentX] = sz[parentX] + sz[parentY];
}
else
{
parent[parentX]= parentY;
sz[parentY] = sz[parentY] + sz[parentX];
}
}
};
int earliestConnectedTimestamp(vector<string> riders, vector<string> logs)
{
int components = riders.size();
long long int timestamp;
string person1,person2,relation;
DSU dsu(components);
unordered_map <string,int> usertoID;
int id=0;
for(int i=0;i<riders.size();i++)
{
usertoID.insert({riders[i],++id});
}
for(auto it : logs)
{
stringstream ss(it);
ss>>timestamp>>person1>>relation>>person2;
if(dsu.findParent(usertoID[person1])!=dsu.findParent(usertoID[person2]))
{
dsu.unite(usertoID[person1],usertoID[person2]);
components--;
}
if(components==1)
{
return timestamp;
}
}
return 0;
}
int main() {
// your code goes here
vector<string> riders = {
"Alice",
"Bob",
"Charlie",
"Dan",
"Eve"
};
vector<string> logs = {
"1670000001 Alice shared-ride-with Bob",
"1670000042 Charlie shared-ride-with Dan",
"1670000450 Bob shared-ride-with Charlie",
"1670000501 Alice shared-ride-with Eve",
"1670000621 Bob shared-ride-with Dan"
};
cout << earliestConnectedTimestamp(riders, logs) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY2xhc3MgRFNVCnsKcHVibGljIDoKCWludCBuOwoJdmVjdG9yPGludD4gc3o7Cgl2ZWN0b3I8aW50PiBwYXJlbnQ7CglEU1UgKGludCBudW0pCgl7CgkJbj0gbnVtOwoJCXN6LnJlc2l6ZShudW0rMSwxKTsKCQlwYXJlbnQucmVzaXplKG51bSsxLDEpOwoJCWZvcihpbnQgaT0wO2k8PW51bTtpKyspCgkJewoJCQlwYXJlbnRbaV09aTsKCQl9Cgl9CgkKCWludCBmaW5kUGFyZW50IChpbnQgeCkKCXsKCQlpZih4PT1wYXJlbnRbeF0pCgkJcmV0dXJuIHg7CgkJZWxzZQoJCXsKCQkJcmV0dXJuIHBhcmVudFt4XT0gZmluZFBhcmVudChwYXJlbnRbeF0pOwoJCX0KCX0KCXZvaWQgdW5pdGUoaW50IHgsaW50IHkpCgl7CgkJaW50IHBhcmVudFggPSBmaW5kUGFyZW50KHgpOwoJCWludCBwYXJlbnRZID0gZmluZFBhcmVudCh5KTsKCQlpZihzeltwYXJlbnRYXSA+IHN6IFtwYXJlbnRZXSkKCQl7CgkJCXBhcmVudFtwYXJlbnRZXT0gcGFyZW50WDsKCQkJc3pbcGFyZW50WF0gPSBzeltwYXJlbnRYXSArIHN6W3BhcmVudFldOwoJCX0KCQllbHNlCgkJewoJCQlwYXJlbnRbcGFyZW50WF09IHBhcmVudFk7CgkJCXN6W3BhcmVudFldID0gc3pbcGFyZW50WV0gKyBzeltwYXJlbnRYXTsKCQl9Cgl9Cn07CgppbnQgZWFybGllc3RDb25uZWN0ZWRUaW1lc3RhbXAodmVjdG9yPHN0cmluZz4gcmlkZXJzLCAgdmVjdG9yPHN0cmluZz4gbG9ncykKCnsKCWludCBjb21wb25lbnRzID0gcmlkZXJzLnNpemUoKTsKCWxvbmcgbG9uZyBpbnQgdGltZXN0YW1wOwoJc3RyaW5nIHBlcnNvbjEscGVyc29uMixyZWxhdGlvbjsKCURTVSBkc3UoY29tcG9uZW50cyk7Cgl1bm9yZGVyZWRfbWFwIDxzdHJpbmcsaW50PiB1c2VydG9JRDsKCWludCBpZD0wOwoJZm9yKGludCBpPTA7aTxyaWRlcnMuc2l6ZSgpO2krKykKCXsKCQl1c2VydG9JRC5pbnNlcnQoe3JpZGVyc1tpXSwrK2lkfSk7Cgl9Cglmb3IoYXV0byBpdCA6IGxvZ3MpCgl7CgkJc3RyaW5nc3RyZWFtIHNzKGl0KTsKCQlzcz4+dGltZXN0YW1wPj5wZXJzb24xPj5yZWxhdGlvbj4+cGVyc29uMjsKCQlpZihkc3UuZmluZFBhcmVudCh1c2VydG9JRFtwZXJzb24xXSkhPWRzdS5maW5kUGFyZW50KHVzZXJ0b0lEW3BlcnNvbjJdKSkKCQl7CgkJCWRzdS51bml0ZSh1c2VydG9JRFtwZXJzb24xXSx1c2VydG9JRFtwZXJzb24yXSk7CgkJCWNvbXBvbmVudHMtLTsKCQl9CgkJaWYoY29tcG9uZW50cz09MSkKCQl7CgkJCXJldHVybiB0aW1lc3RhbXA7CgkJfQoJfQoJcmV0dXJuIDA7Cn0KCmludCBtYWluKCkgewoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJdmVjdG9yPHN0cmluZz4gcmlkZXJzID0gewogICAgICAgICJBbGljZSIsCiAgICAgICAgIkJvYiIsCiAgICAgICAgIkNoYXJsaWUiLAogICAgICAgICJEYW4iLAogICAgICAgICJFdmUiCiAgICB9OwoKICAgIHZlY3RvcjxzdHJpbmc+IGxvZ3MgPSB7CiAgICAgICAgIjE2NzAwMDAwMDEgQWxpY2Ugc2hhcmVkLXJpZGUtd2l0aCBCb2IiLAogICAgICAgICIxNjcwMDAwMDQyIENoYXJsaWUgc2hhcmVkLXJpZGUtd2l0aCBEYW4iLAogICAgICAgICIxNjcwMDAwNDUwIEJvYiBzaGFyZWQtcmlkZS13aXRoIENoYXJsaWUiLAogICAgICAgICIxNjcwMDAwNTAxIEFsaWNlIHNoYXJlZC1yaWRlLXdpdGggRXZlIiwKICAgICAgICAiMTY3MDAwMDYyMSBCb2Igc2hhcmVkLXJpZGUtd2l0aCBEYW4iCiAgICB9OwoKICAgIGNvdXQgPDwgZWFybGllc3RDb25uZWN0ZWRUaW1lc3RhbXAocmlkZXJzLCBsb2dzKSA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9