void solve(){
vector<vi> matrix = {
{0,1,1,1},
{1,1,1,1},
{0,1,1,1}
};
int n = matrix.size(); // кол-во строк
int m = matrix[0].size(); // кол-во столбцов
int ans = 0; // итоговый ответ
// dp[i][j] = размер максимального квадрата с правым нижним углом в (i,j)
vector<vector<int>> dp = matrix;
forn(i,0,n){
forn(j,0,m){
if (i==0 || j==0) {
// На первой строке и первом столбце
// квадрат может быть только 1x1, если matrix[i][j] == 1
dp[i][j] = matrix[i][j];
} else if (matrix[i][j] == 1) {
// Если в текущей клетке 1, то смотрим:
// берём минимальный размер квадрата из трёх соседей:
// сверху (i-1,j), слева (i,j-1), по диагонали (i-1,j-1)
// и добавляем 1 (за текущую клетку)
dp[i][j] = 1 + min({dp[i-1][j], dp[i-1][j-1], dp[i][j-1]});
} else {
// Если в текущей клетке 0 — квадрат не получится
dp[i][j] = 0;
}
// Каждая dp[i][j] добавляет столько квадратов,
// сколько квадратов оканчиваются в (i,j)
ans += dp[i][j];
}
}
cout << ans;
}