#include <vector>
#include <set>
#include <typeinfo>
#include <cassert>
#include <algorithm>
#define RANGE(x) (x).begin(), (x).end()
template < class T>
struct is_STL_container
{
static const bool value = false ;
} ;
template < class T, typename alloc>
struct is_STL_container< std:: vector < T, alloc>>
{
static const bool value = true ;
} ;
template < class T, class comp, typename alloc>
struct is_STL_container< std:: set < T, comp, alloc>>
{
static const bool value = true ;
} ;
template < class T1, class T2,
class = std:: enable_if_t < is_STL_container< T1> :: value &&
is_STL_container< T2> :: value > :: value >
T1 operator - ( const T1 & l, const T2 & r)
{
assert ( typeid ( typename T1:: value_type ) == typeid ( typename T2:: value_type ) ) ;
std:: vector < typename T1:: value_type > result;
std:: set_difference ( RANGE( l) , RANGE( r) , std:: back_inserter ( result) ) ;
return T1( RANGE( result) ) ;
}
int main( ) {
// your code goes here
return 0 ;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPHR5cGVpbmZvPgojaW5jbHVkZSA8Y2Fzc2VydD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCiNkZWZpbmUgUkFOR0UoeCkgKHgpLmJlZ2luKCksICh4KS5lbmQoKQoKdGVtcGxhdGU8Y2xhc3MgVD4Kc3RydWN0IGlzX1NUTF9jb250YWluZXIKewogICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKfTsKCnRlbXBsYXRlPGNsYXNzIFQsIHR5cGVuYW1lIGFsbG9jPgpzdHJ1Y3QgaXNfU1RMX2NvbnRhaW5lcjxzdGQ6OnZlY3RvcjxULCBhbGxvYz4+CnsKICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKfTsKCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIGNvbXAsIHR5cGVuYW1lIGFsbG9jPgpzdHJ1Y3QgaXNfU1RMX2NvbnRhaW5lcjxzdGQ6OnNldDxULCBjb21wLCBhbGxvYz4+CnsKICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKfTsKCgp0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyLAogIGNsYXNzID0gc3RkOjplbmFibGVfaWZfdDxpc19TVExfY29udGFpbmVyPFQxPjo6dmFsdWUgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfU1RMX2NvbnRhaW5lcjxUMj46OnZhbHVlPjo6dmFsdWU+ClQxIG9wZXJhdG9yIC0gKGNvbnN0IFQxICZsLCBjb25zdCBUMiAmcikKewogICAgYXNzZXJ0KHR5cGVpZCh0eXBlbmFtZSBUMTo6dmFsdWVfdHlwZSkgPT0gdHlwZWlkKHR5cGVuYW1lIFQyOjp2YWx1ZV90eXBlKSk7CgogICAgc3RkOjp2ZWN0b3I8dHlwZW5hbWUgVDE6OnZhbHVlX3R5cGU+IHJlc3VsdDsKICAgIHN0ZDo6c2V0X2RpZmZlcmVuY2UoUkFOR0UobCksIFJBTkdFKHIpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIocmVzdWx0KSk7CiAgICByZXR1cm4gVDEoUkFOR0UocmVzdWx0KSk7Cn0KCmludCBtYWluKCkgewoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJcmV0dXJuIDA7Cn0=