#include <bits/stdc++.h>
using namespace std;
class DSU
{
public:
unordered_map<string,string> parent;
unordered_map<string, int> sz;
string getKey(long x,long y)
{
return to_string(x) +"_"+ to_string(y);
}
string findParent(string key)
{
if(parent[key]==key)
return key;
else
{
parent[key] = findParent(parent[key]);
return parent[key];
}
}
bool unite(long x1,long y1,long x,long y)
{
string parentKey = findParent(getKey(x,y));
string parentKey1 = findParent(getKey(x1,y1));
if(parentKey==parentKey1)
return false;
else
{
if (sz[parentKey] < sz[parentKey1]) {
parent[parentKey] = parentKey1;
sz[parentKey1] += sz[parentKey];
} else {
parent[parentKey1] = parentKey;
sz[parentKey] += sz[parentKey1];
}
return true;
}
}
};
class Grid
{
public:
unordered_set<string> landLoc;
DSU dsuObj;
long islandCount=0;
vector<vector<long>> dir = {{1,0},{0,1},{-1,0},{0,-1}};
string getKey(long x,long y)
{
return to_string(x) +"_"+ to_string(y);
}
void addLand(long x, long y)
{
string key = getKey(x,y);
if(!landLoc.count(key))
{
landLoc.insert(key);
dsuObj.parent[key] =key;
dsuObj.sz[key]=1;
islandCount++;
for(int k=0;k<=3;k++)
{
long newX = x+ dir[k][0];
long newY = y + dir[k][1];
string newKey = getKey(newX,newY);
if(landLoc.count(newKey))
{
bool isSuccess = dsuObj.unite(x,y,newX,newY);
if(isSuccess)
{
islandCount--;
}
}
}
}
}
bool isLand(long x,long y)
{
string key = to_string(x) +"_"+ to_string(y);
if(landLoc.count(key))
{
return true;
}
else
return false;
}
long getNumberofIsland()
{
return islandCount;
}
};
int main() {
// your code goes here
Grid stringMap;
stringMap.addLand(5, 10);
stringMap.addLand(5, 11);
stringMap.addLand(2, 11);
stringMap.addLand(3, 11);
stringMap.addLand(4, 11);
cout << "Is (5, 10) land? " << (stringMap.isLand(5, 10) ? "Yes" : "No") << endl;
cout << "Is (5, 11) land? " << (stringMap.isLand(5, 11) ? "Yes" : "No") << endl;
cout<<"Count of lands:"<<stringMap.getNumberofIsland()<<endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBEU1UKewoJcHVibGljOgoJdW5vcmRlcmVkX21hcDxzdHJpbmcsc3RyaW5nPiBwYXJlbnQ7Cgl1bm9yZGVyZWRfbWFwPHN0cmluZywgaW50PiBzejsKCQoJc3RyaW5nIGdldEtleShsb25nIHgsbG9uZyB5KQoJewoJCXJldHVybiB0b19zdHJpbmcoeCkgKyJfIisgdG9fc3RyaW5nKHkpOwoJfQoJCglzdHJpbmcgZmluZFBhcmVudChzdHJpbmcga2V5KQoJewoJCWlmKHBhcmVudFtrZXldPT1rZXkpCgkJcmV0dXJuIGtleTsKCQllbHNlCgkJewoJCXBhcmVudFtrZXldID0gZmluZFBhcmVudChwYXJlbnRba2V5XSk7CgkJcmV0dXJuIHBhcmVudFtrZXldOwoJCX0KCQkKCX0KCQoJYm9vbCB1bml0ZShsb25nIHgxLGxvbmcgeTEsbG9uZyB4LGxvbmcgeSkKCXsKCQlzdHJpbmcgcGFyZW50S2V5ID0gZmluZFBhcmVudChnZXRLZXkoeCx5KSk7CgkJc3RyaW5nIHBhcmVudEtleTEgPSBmaW5kUGFyZW50KGdldEtleSh4MSx5MSkpOwoJCWlmKHBhcmVudEtleT09cGFyZW50S2V5MSkKCQkJcmV0dXJuIGZhbHNlOwoJCWVsc2UKCQl7CgkJCWlmIChzeltwYXJlbnRLZXldIDwgc3pbcGFyZW50S2V5MV0pIHsKICAgICAgICAgICAgcGFyZW50W3BhcmVudEtleV0gPSBwYXJlbnRLZXkxOwogICAgICAgICAgICBzeltwYXJlbnRLZXkxXSArPSBzeltwYXJlbnRLZXldOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHBhcmVudFtwYXJlbnRLZXkxXSA9IHBhcmVudEtleTsKICAgICAgICAgICAgc3pbcGFyZW50S2V5XSArPSBzeltwYXJlbnRLZXkxXTsKICAgICAgICB9CgkJCXJldHVybiB0cnVlOwoJCX0KCX0KfTsKCmNsYXNzIEdyaWQKewoJcHVibGljOgoJdW5vcmRlcmVkX3NldDxzdHJpbmc+IGxhbmRMb2M7CglEU1UgZHN1T2JqOwoJbG9uZyBpc2xhbmRDb3VudD0wOwoJdmVjdG9yPHZlY3Rvcjxsb25nPj4gZGlyID0ge3sxLDB9LHswLDF9LHstMSwwfSx7MCwtMX19OwoJCglzdHJpbmcgZ2V0S2V5KGxvbmcgeCxsb25nIHkpCgl7CgkJcmV0dXJuIHRvX3N0cmluZyh4KSArIl8iKyB0b19zdHJpbmcoeSk7Cgl9CgkKCXZvaWQgYWRkTGFuZChsb25nIHgsIGxvbmcgeSkKCXsKCQlzdHJpbmcga2V5ID0gZ2V0S2V5KHgseSk7CgkJaWYoIWxhbmRMb2MuY291bnQoa2V5KSkKCQl7CgkJCWxhbmRMb2MuaW5zZXJ0KGtleSk7CgkJCWRzdU9iai5wYXJlbnRba2V5XSA9a2V5OwoJCQlkc3VPYmouc3pba2V5XT0xOwoJCQlpc2xhbmRDb3VudCsrOwoJCQlmb3IoaW50IGs9MDtrPD0zO2srKykKCQkJewoJCQkJbG9uZyBuZXdYID0geCsgZGlyW2tdWzBdOwoJCQkJbG9uZyBuZXdZID0geSArIGRpcltrXVsxXTsKCQkJCXN0cmluZyBuZXdLZXkgPSBnZXRLZXkobmV3WCxuZXdZKTsKCQkJCWlmKGxhbmRMb2MuY291bnQobmV3S2V5KSkKCQkJCXsKCQkJCQlib29sIGlzU3VjY2VzcyA9IGRzdU9iai51bml0ZSh4LHksbmV3WCxuZXdZKTsKCQkJCQlpZihpc1N1Y2Nlc3MpCgkJCQkJewoJCQkJCQlpc2xhbmRDb3VudC0tOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQkKCQl9CgkJCgl9CgkKCWJvb2wgaXNMYW5kKGxvbmcgeCxsb25nIHkpCgl7CgkJc3RyaW5nIGtleSA9IHRvX3N0cmluZyh4KSArIl8iKyB0b19zdHJpbmcoeSk7CgkJaWYobGFuZExvYy5jb3VudChrZXkpKQoJCXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWVsc2UKCQlyZXR1cm4gZmFsc2U7Cgl9CgkKCWxvbmcgZ2V0TnVtYmVyb2ZJc2xhbmQoKQoJewoJCXJldHVybiBpc2xhbmRDb3VudDsKCX0KCQp9OwoKaW50IG1haW4oKSB7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCglHcmlkIHN0cmluZ01hcDsKICAgIHN0cmluZ01hcC5hZGRMYW5kKDUsIDEwKTsKICAgIHN0cmluZ01hcC5hZGRMYW5kKDUsIDExKTsKICAgIHN0cmluZ01hcC5hZGRMYW5kKDIsIDExKTsKICAgIHN0cmluZ01hcC5hZGRMYW5kKDMsIDExKTsKICAgIHN0cmluZ01hcC5hZGRMYW5kKDQsIDExKTsKCiAgICBjb3V0IDw8ICJJcyAoNSwgMTApIGxhbmQ/ICIgPDwgKHN0cmluZ01hcC5pc0xhbmQoNSwgMTApID8gIlllcyIgOiAiTm8iKSA8PCBlbmRsOwogICAgY291dCA8PCAiSXMgKDUsIDExKSBsYW5kPyAiIDw8IChzdHJpbmdNYXAuaXNMYW5kKDUsIDExKSA/ICJZZXMiIDogIk5vIikgPDwgZW5kbDsKCWNvdXQ8PCJDb3VudCBvZiBsYW5kczoiPDxzdHJpbmdNYXAuZ2V0TnVtYmVyb2ZJc2xhbmQoKTw8ZW5kbDsKICAgIHJldHVybiAwOwp9