#include <iostream>
#include <vector>
#include <iomanip> // ← for setw
using namespace std;
int trap(const vector<int>& height) {
int left = 0, right = (int)height.size() - 1;
int leftMax = 0, rightMax = 0;
int totalWater = 0;
int step = 1;
cout << "Step | left | right | h[left] | h[right] | leftMax | rightMax | added | totalWater\n";
cout << "-------------------------------------------------------------------------------\n";
while (left < right) {
int added = 0;
if (height[left] < height[right]) {
// Fill on the left side
if (height[left] >= leftMax) {
leftMax = height[left];
} else {
added = leftMax - height[left];
totalWater += added;
}
cout << setw(4) << step++ << " | "
<< setw(4) << left << " | "
<< setw(5) << right << " | "
<< setw(7) << height[left] << " | "
<< setw(8) << height[right] << " | "
<< setw(7) << leftMax << " | "
<< setw(8) << rightMax << " | "
<< setw(5) << added << " | "
<< setw(10) << totalWater << "\n";
left++;
} else {
// Fill on the right side
if (height[right] >= rightMax) {
rightMax = height[right];
} else {
added = rightMax - height[right];
totalWater += added;
}
cout << setw(4) << step++ << " | "
<< setw(4) << left << " | "
<< setw(5) << right << " | "
<< setw(7) << height[left] << " | "
<< setw(8) << height[right] << " | "
<< setw(7) << leftMax << " | "
<< setw(8) << rightMax << " | "
<< setw(5) << added << " | "
<< setw(10) << totalWater << "\n";
right--;
}
}
return totalWater;
}
int main() {
vector<int> height = {0,1,0,2,1,0,1,3,2,1,2,1};
int result = trap(height);
cout << "\nFinal trapped water = " << result << endl;
return 0;
}