#include <iostream>
#include <bits/stdc++.h>
using namespace std;
class DSU
{
public :
vector< long > size;
vector< long > parent;
DSU ( long r,long c)
{
size.resize ( r* c+ 1 ) ;
parent.resize ( r* c+ 1 ) ;
for ( long i= 0 ; i< r; i++ )
{
for ( long j= 0 ; j< c; j++ )
{
size[ i* c+ j] = 1 ;
parent[ i* c+ j] = i* c+ j;
}
}
}
DSU ( )
{
}
long findParent( long node)
{
if ( parent[ node] == node)
return node;
else
{
parent[ node] = findParent( parent[ node] ) ;
return parent[ node] ;
}
}
void unionBySize ( long x ,long y)
{
long parentX= findParent( x) ;
long parentY = findParent( y) ;
if ( parentX== parentY)
{
return ;
}
else if ( size[ parentX] > size[ parentY] )
{
size[ parentX] + = size[ parentY] ;
parent[ parentY] = parentX;
}
else
{
size[ parentY] + = size[ parentX] ;
parent[ parentX] = parentY;
}
}
} ;
class DeliveryService
{
public :
long r;
long c;
vector< vector< long >> matrix;
DSU dsuObj;
vector< vector< long >> dir = { { - 1 ,0 } ,{ 0 ,- 1 } ,{ 1 ,0 } ,{ 0 ,1 } } ;
long openRestaurants= 0 ;
DeliveryService ( long r0,long c0)
{
r= r0;
c= c0;
vector< vector< long >> localMatrix( r0,vector< long > ( c0,0 ) ) ;
matrix = localMatrix;
dsuObj = DSU( r0, c0) ;
}
void openRestaurant( long i,long j)
{
if ( matrix[ i] [ j] == 0 )
{
openRestaurants++ ;
matrix[ i] [ j] ++ ;
for ( int k = 0 ; k< 4 ; k++ )
{
int adjI = i + dir[ k] [ 0 ] ;
int adjJ = j+ dir[ k] [ 1 ] ;
if ( adjI >= 0 && adjI < r && adjJ>= 0 && adjJ < c)
{
if ( matrix[ adjI] [ adjJ] > 0 )
{
int originalNode = i* c+ j;
int adjNode = adjI* c+ adjJ;
if ( dsuObj.findParent ( originalNode) ! = dsuObj.findParent ( adjNode) )
{
dsuObj.unionBySize ( i* c+ j,adjI* c+ adjJ) ;
openRestaurants-- ;
}
}
}
}
}
else
{
matrix[ i] [ j] ++ ;
}
}
long countDeliveryZones( )
{
return openRestaurants;
}
long countOpenRestaurants( long i, long j)
{
return matrix[ i] [ j] ;
}
bool hasOpenRestaurant ( long i ,long j)
{
if ( matrix[ i] [ j] == 0 )
{
return false ;
}
else
return true ;
}
} ;
int main( ) {
// your code goes here
cout << "program started:" ;
DeliveryService ds( 3 , 3 ) ;
ds.openRestaurant ( 0 ,0 ) ;
cout << "Delivery zones are :" << ds.countDeliveryZones ( ) ;
cout << "\n " ;
ds.openRestaurant ( 0 ,2 ) ;
cout << "Delivery zones are :" << ds.countDeliveryZones ( ) ;
cout << "\n " ;
ds.openRestaurant ( 0 ,1 ) ;
cout << "Delivery zones are :" << ds.countDeliveryZones ( ) ;
cout << "\n " ;
ds.openRestaurant ( 2 ,2 ) ;
cout << "Delivery zones are :" << ds.countDeliveryZones ( ) ;
cout << "\n " ;
ds.openRestaurant ( 2 ,0 ) ;
cout << "Delivery zones are :" << ds.countDeliveryZones ( ) ;
cout << "\n " ;
ds.openRestaurant ( 1 ,2 ) ;
cout << "Delivery zones are :" << ds.countDeliveryZones ( ) ;
cout << "\n " ;
ds.openRestaurant ( 1 ,2 ) ;
cout << "Delivery zones are :" << ds.countDeliveryZones ( ) ;
cout << "\n " ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIERTVQp7CglwdWJsaWMgOgoJdmVjdG9yPGxvbmc+IHNpemU7Cgl2ZWN0b3I8bG9uZz4gcGFyZW50OwoJRFNVIChsb25nIHIsbG9uZyBjKQoJewoJCXNpemUucmVzaXplKHIqYysxKTsKCQlwYXJlbnQucmVzaXplKHIqYysxKTsKCQlmb3IobG9uZyBpPTA7aTxyO2krKykKCQl7CgkJCWZvcihsb25nIGo9MDtqPGM7aisrKQoJCQl7CgkJCQlzaXplW2kqYytqXT0xOwoJCQkJcGFyZW50W2kqYytqXT1pKmMrajsKCQkJfQoJCX0KCX0KCURTVSAoKQoJewoJCQoJfQoJbG9uZyBmaW5kUGFyZW50KGxvbmcgbm9kZSkKCXsKCQlpZihwYXJlbnRbbm9kZV09PW5vZGUpCgkJcmV0dXJuIG5vZGU7CgkJZWxzZQoJCXsKCQlwYXJlbnRbbm9kZV09IGZpbmRQYXJlbnQocGFyZW50W25vZGVdKTsKCQlyZXR1cm4gcGFyZW50W25vZGVdOwoJCX0KCX0KCQoJdm9pZCB1bmlvbkJ5U2l6ZSAobG9uZyB4ICxsb25nIHkpCgl7CgkJbG9uZyBwYXJlbnRYPSBmaW5kUGFyZW50KHgpOwoJCWxvbmcgcGFyZW50WSA9IGZpbmRQYXJlbnQoeSk7CgkJaWYocGFyZW50WD09IHBhcmVudFkpCgkJewoJCQlyZXR1cm47CgkJfQoJCWVsc2UgaWYgKHNpemVbcGFyZW50WF0gPnNpemVbcGFyZW50WV0pCgkJewoJCQlzaXplW3BhcmVudFhdKz0gc2l6ZVtwYXJlbnRZXTsKCQkJcGFyZW50W3BhcmVudFldID0gcGFyZW50WDsKCQl9CgkJZWxzZQoJCXsKCQkJc2l6ZVtwYXJlbnRZXSs9IHNpemVbcGFyZW50WF07CgkJCXBhcmVudFtwYXJlbnRYXSA9IHBhcmVudFk7CQoJCX0KCX0KfTsKCmNsYXNzIERlbGl2ZXJ5U2VydmljZQp7CglwdWJsaWM6Cglsb25nIHI7Cglsb25nIGM7Cgl2ZWN0b3I8dmVjdG9yPGxvbmc+PiBtYXRyaXg7CglEU1UgZHN1T2JqOwoJdmVjdG9yPHZlY3Rvcjxsb25nPj4gZGlyID0ge3stMSwwfSx7MCwtMX0sezEsMH0sezAsMX19OwoJbG9uZyBvcGVuUmVzdGF1cmFudHM9MDsKCURlbGl2ZXJ5U2VydmljZSAobG9uZyByMCxsb25nIGMwKQoJewoJCXI9cjA7CgkJYz1jMDsKCQl2ZWN0b3I8dmVjdG9yPGxvbmc+PiBsb2NhbE1hdHJpeChyMCx2ZWN0b3I8bG9uZz4gKGMwLDApKTsKCQltYXRyaXggPSBsb2NhbE1hdHJpeDsKCQlkc3VPYmogPSBEU1UocjAsIGMwKTsKCQkKCX0KCQoJdm9pZCBvcGVuUmVzdGF1cmFudChsb25nIGksbG9uZyBqKQoJewoJCWlmKG1hdHJpeFtpXVtqXT09MCkKCQl7CgkJCW9wZW5SZXN0YXVyYW50cysrOwoJCQltYXRyaXhbaV1bal0rKzsKCQkJZm9yKGludCBrID0wO2s8NDtrKyspCgkJCXsKCQkJCWludCBhZGpJID0gaSArIGRpcltrXVswXTsKCQkJCWludCBhZGpKID0gaisgZGlyW2tdWzFdOwoJCQkJaWYoYWRqSSA+PTAgJiYgYWRqSSA8ciAmJiBhZGpKPj0wICYmIGFkakogPCBjKQoJCQkJewoJCQkJCWlmKG1hdHJpeFthZGpJXVthZGpKXT4wKQoJCQkJCXsKCQkJCQkJaW50IG9yaWdpbmFsTm9kZSA9IGkqYytqOwoJCQkJCQlpbnQgYWRqTm9kZSA9IGFkakkqYythZGpKOwoJCQkJCQlpZihkc3VPYmouZmluZFBhcmVudChvcmlnaW5hbE5vZGUpIT1kc3VPYmouZmluZFBhcmVudChhZGpOb2RlKSkKCQkJCQkJewoJCQkJCQlkc3VPYmoudW5pb25CeVNpemUoaSpjK2osYWRqSSpjK2FkakopOwoJCQkJCQlvcGVuUmVzdGF1cmFudHMtLTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQllbHNlCgkJewoJCQltYXRyaXhbaV1bal0rKzsKCQl9Cgl9CgkKCWxvbmcgY291bnREZWxpdmVyeVpvbmVzKCkKCXsKCQlyZXR1cm4gb3BlblJlc3RhdXJhbnRzOwoJfQoJbG9uZyBjb3VudE9wZW5SZXN0YXVyYW50cyhsb25nIGksIGxvbmcgaikKCXsKCQlyZXR1cm4gbWF0cml4W2ldW2pdOwoJfQoJYm9vbCBoYXNPcGVuUmVzdGF1cmFudCAobG9uZyBpICxsb25nIGopCgl7CgkJaWYobWF0cml4W2ldW2pdPT0wKQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQllbHNlCgkJcmV0dXJuIHRydWU7Cgl9CgkKfTsKCmludCBtYWluKCkgewoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJY291dDw8InByb2dyYW0gc3RhcnRlZDoiOwoJRGVsaXZlcnlTZXJ2aWNlIGRzKDMsIDMpOwoJZHMub3BlblJlc3RhdXJhbnQoMCwwKTsKCWNvdXQ8PCJEZWxpdmVyeSB6b25lcyBhcmUgOiIgPDxkcy5jb3VudERlbGl2ZXJ5Wm9uZXMoKTsKCWNvdXQ8PCJcbiI7Cglkcy5vcGVuUmVzdGF1cmFudCgwLDIpOwoJY291dDw8IkRlbGl2ZXJ5IHpvbmVzIGFyZSA6IiA8PGRzLmNvdW50RGVsaXZlcnlab25lcygpOwoJY291dDw8IlxuIjsKCWRzLm9wZW5SZXN0YXVyYW50KDAsMSk7Cgljb3V0PDwiRGVsaXZlcnkgem9uZXMgYXJlIDoiIDw8ZHMuY291bnREZWxpdmVyeVpvbmVzKCk7Cgljb3V0PDwiXG4iOwoJZHMub3BlblJlc3RhdXJhbnQoMiwyKTsKCWNvdXQ8PCJEZWxpdmVyeSB6b25lcyBhcmUgOiIgPDxkcy5jb3VudERlbGl2ZXJ5Wm9uZXMoKTsKCWNvdXQ8PCJcbiI7Cglkcy5vcGVuUmVzdGF1cmFudCgyLDApOwoJY291dDw8IkRlbGl2ZXJ5IHpvbmVzIGFyZSA6IiA8PGRzLmNvdW50RGVsaXZlcnlab25lcygpOwoJY291dDw8IlxuIjsKCWRzLm9wZW5SZXN0YXVyYW50KDEsMik7Cgljb3V0PDwiRGVsaXZlcnkgem9uZXMgYXJlIDoiIDw8ZHMuY291bnREZWxpdmVyeVpvbmVzKCk7Cgljb3V0PDwiXG4iOwoJZHMub3BlblJlc3RhdXJhbnQoMSwyKTsKCWNvdXQ8PCJEZWxpdmVyeSB6b25lcyBhcmUgOiIgPDxkcy5jb3VudERlbGl2ZXJ5Wm9uZXMoKTsKCWNvdXQ8PCJcbiI7CglyZXR1cm4gMDsKCQp9