class CrossingTheRiver
{
bool possiblePick(int waterWidth, int landWidth, vector<int> rem, int depth,
int wl, int wh, int ll, int lh)
{
// we need at least one block of each of the heights between wl and wh:
for (int x=wl; x<=wh; x++) {
if ( (--waterWidth < 0) || (--rem[x] < 0) ) {
return false;
}
}
// we need at least one block of each of the heights between ll and lh:
for (int x=ll; x<=lh; x++) {
if ( (--landWidth < 0) || (--rem[x] < 0) ) {
return false;
}
}
// count the number of blocks in the intervals that we can use.
// inter is the number of blocks that can be used both to fill the water
// and to fill the land.
int inter = 0;
int landonly = 0;
int wateronly = 0;
for (int x=depth; x<=100; x++) {
bool water = ( wl <= x && x <= wh);
bool land = ( ll <= x && x <= lh);
if ( water && land ) {
inter += rem[x];
} else if (water) {
wateronly += rem[x];
} else if (land) {
landonly += rem[x];
}
}
// first use the blocks not in the intersection.
waterWidth = max(0, waterWidth - wateronly);
landWidth = max(0, landWidth - landonly);
// use the remaining blocks
return ( waterWidth + landWidth <= inter );
}
string isItEvenPossible(int waterWidth, int landWidth, vector <int> blockHeight, int depth)
{
int n = blockHeight.size();
vector<int> count(101, 0);
for (int i=0; i<n; i++) {
count[ blockHeight[i] ]++;
}
if (count[depth] >= waterWidth) {
return "POSSIBLE";
}
for (int wl=depth; wl<=depth+1; wl++) if (count[wl]) {
for (int wh=wl; wh<=100; wh++) if (count[wh]) {
for (int ll=wh-depth; ll<=wh-depth+1; ll++) if ( (ll>=0) && count[ll]) {
for (int lh=ll; lh<=100; lh++) if (count[lh]) {
if (possiblePick(waterWidth, landWidth, count, depth, wl,wh, ll,lh)) {
cout << wl << " " << wh <<" ; "<<ll<<" ; "<<lh<<endl;
return "POSSIBLE";
}
}
}
}
}
return "IMPOSSIBLE";
}
};