#include #include #include using namespace std; struct STree { int64_t x, y; }; vector trees; int64_t side; bool roh(bool x1, bool y1, int64_t sx, int64_t sy) { size_t in = 0; for (size_t i = 0; i < trees.size(); ++i) { if (x1) { if (trees[i].x < side - sx) continue; } else { if (trees[i].x >= sx) continue; } if (y1) { if (trees[i].y < side - sy) continue; } else { if (trees[i].y >= sy) continue; } in++; } //std::cout << "Trees in: " << in << " for sx: " << sx << " sy: " << sy << " area: " << sx*sy << " and side: " << side << " and trees " << trees.size() << std::endl; return in*2 == trees.size(); } int main() { while (cin.good() && !cin.eof()) { cin >> side; int64_t numTrees; cin >> numTrees; if (cin.eof()) return 0; trees.resize(numTrees); for (size_t i = 0; i < trees.size(); ++i) { int64_t x0, y0; cin >> x0 >> y0; trees[i].x = x0; trees[i].y = y0; } //std::cout << numTrees << 'a' << std::endl; if ((numTrees % 2) == 1) { cout << -1 << endl; continue; } bool found = false; int64_t minfound = 0; for (int64_t sx = 0; sx < side; ++sx) { for (int64_t sy = 0; sy < side; ++sy) { if (found && sx*sy >= minfound) break; if (roh(0,0,sx, sy) || roh(0,1,sx, sy) || roh(1,0,sx, sy) || roh(1,1,sx,sy)) { //cout << "FOUND: " << sx*sy << endl; int64_t distfound = sx*sy; if (!found || minfound > distfound) { minfound = distfound; } found = true; continue; } } } if (found) cout << minfound << endl; else cout << -1 << endl; } return 0; }