#include #include #include using namespace std; struct point { long int x; long int y; }; namespace gl { long long int count = 0; } void find_point(int id, point* fetched, list pts) { list::iterator it; for ( it=pts.begin() ; it != pts.end(); it++ ) { switch(id) { case 1: if (fetched[id-1].x < (*it).x && fetched[id-1].y < (*it).y) { point* tmp = fetched; point p; p.x = (*it).x; p.y = (*it).y; tmp[id] = p; find_point(id+1, tmp, pts); } break; case 3: if (fetched[id-1].x < (*it).x && fetched[id-1].y < (*it).y) { point* tmp = fetched; point p; p.x = (*it).x; p.y = (*it).y; tmp[id] = p; find_point(id+1, tmp, pts); } break; case 2: if (fetched[1].x < (*it).x && fetched[1].y > (*it).y && fetched[0].y < (*it).y) { point* tmp = fetched; point p; p.x = (*it).x; p.y = (*it).y; tmp[id] = p; find_point(id+1, tmp, pts); } break; case 4: if (fetched[3].x < (*it).x && fetched[2].y > (*it).y) { ++gl::count; } break; } } } int main(){ fstream fh; fh.open ("countm.in", fstream::in); int N; fh >> N; list pts; list::iterator it; long int x, y; while (fh >> x >> y && N < 100000) { if (x > -1000000000 && x < 1000000000 && y > -1000000000 && y < 1000000000){ point p; p.x = x; p.y = y; pts.push_back(p); } } fh.close(); for ( it=pts.begin() ; it != pts.end(); it++ ) { point fetched[5]; point p; p.x = (*it).x; p.y = (*it).y; fetched[0] = p; find_point(1, fetched, pts); break; } fstream out; out.open ("countm.out", fstream::out); out << gl::count % 1000000007 << endl; out.close(); return 0; }