#include <boost/multiprecision/cpp_bin_float.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <iostream>
#include <cstdint>
#include <vector>
#include <cmath>
#include <limits>
#include <ctime>
using namespace boost::multiprecision;
using namespace std;
class PointC {
public:
int64_t x, y;
};
template<typename T>
bool is_tri(const PointC& A, const PointC& B, const PointC& C) {
T a = hypot(T(B.x-C.x), T(B.y-C.y));
T b = hypot(T(C.x-A.x), T(C.y-A.y));
T c = hypot(T(A.x-B.x), T(A.y-B.y));
T en = 1 - numeric_limits<T>::epsilon()*10;
return a < (b+c)*en && b < (c+a)*en && c < (a+b)*en;
}
template<typename T>
void sub(const vector<PointC>& point, const char* msg) {
const size_t N = point.size();
size_t cnt = 0;
clock_t start = clock();
for (size_t i = 0; i < N; ++i)
for (size_t j = i+1; j < N; ++j)
for (size_t k = j+1; k < N; ++k)
if (is_tri<T>(point[i], point[j], point[k]))
++cnt;
clock_t finish = clock();
cout << fixed << left << setw(18) << msg << right << " " << setw(6) << cnt << " "
<< static_cast<double>(finish - start)/CLOCKS_PER_SEC << " sec" << endl;
}
int main() {
size_t N;
cin >> N;
vector<PointC> point(N);
for (auto& po : point)
cin >> po.x >> po.y;
sub<cpp_bin_float_50 >(point, "cpp_bin_float_50" );
sub<cpp_bin_float_100 >(point, "cpp_bin_float_100" );
sub<cpp_bin_float_quad>(point, "cpp_bin_float_quad");
sub<cpp_dec_float_50 >(point, "cpp_dec_float_50" );
sub<cpp_dec_float_100 >(point, "cpp_dec_float_100" );
sub<float >(point, "float" );
sub<double >(point, "double" );
sub<long double >(point, "long double" );
}
I2luY2x1ZGUgPGJvb3N0L211bHRpcHJlY2lzaW9uL2NwcF9iaW5fZmxvYXQuaHBwPgojaW5jbHVkZSA8Ym9vc3QvbXVsdGlwcmVjaXNpb24vY3BwX2RlY19mbG9hdC5ocHA+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxjbWF0aD4KI2luY2x1ZGUgPGxpbWl0cz4KI2luY2x1ZGUgPGN0aW1lPgp1c2luZyBuYW1lc3BhY2UgYm9vc3Q6Om11bHRpcHJlY2lzaW9uOwp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgUG9pbnRDIHsKcHVibGljOgogICAgaW50NjRfdCB4LCB5Owp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KYm9vbCBpc190cmkoY29uc3QgUG9pbnRDJiBBLCBjb25zdCBQb2ludEMmIEIsIGNvbnN0IFBvaW50QyYgQykgewogICAgVCBhID0gaHlwb3QoVChCLngtQy54KSwgVChCLnktQy55KSk7CiAgICBUIGIgPSBoeXBvdChUKEMueC1BLngpLCBUKEMueS1BLnkpKTsKICAgIFQgYyA9IGh5cG90KFQoQS54LUIueCksIFQoQS55LUIueSkpOwoKICAgIFQgZW4gPSAxIC0gbnVtZXJpY19saW1pdHM8VD46OmVwc2lsb24oKSoxMDsKICAgIHJldHVybiBhIDwgKGIrYykqZW4gJiYgYiA8IChjK2EpKmVuICYmIGMgPCAoYStiKSplbjsKfQp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIHN1Yihjb25zdCB2ZWN0b3I8UG9pbnRDPiYgcG9pbnQsIGNvbnN0IGNoYXIqIG1zZykgewogICAgY29uc3Qgc2l6ZV90IE4gPSBwb2ludC5zaXplKCk7CiAgICBzaXplX3QgY250ID0gMDsKCiAgICBjbG9ja190IHN0YXJ0ID0gY2xvY2soKTsKICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTjsgKytpKQogICAgICAgIGZvciAoc2l6ZV90IGogPSBpKzE7IGogPCBOOyArK2opCiAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSBqKzE7IGsgPCBOOyArK2spCiAgICAgICAgICAgICAgICBpZiAoaXNfdHJpPFQ+KHBvaW50W2ldLCBwb2ludFtqXSwgcG9pbnRba10pKQogICAgICAgICAgICAgICAgICAgICsrY250OwogICAgY2xvY2tfdCBmaW5pc2ggPSBjbG9jaygpOwoKICAgIGNvdXQgPDwgZml4ZWQgPDwgbGVmdCA8PCBzZXR3KDE4KSA8PCBtc2cgPDwgcmlnaHQgPDwgIiAiIDw8IHNldHcoNikgPDwgY250IDw8ICIgIgogICAgICAgICA8PCBzdGF0aWNfY2FzdDxkb3VibGU+KGZpbmlzaCAtIHN0YXJ0KS9DTE9DS1NfUEVSX1NFQyA8PCAiIHNlYyIgPDwgZW5kbDsKfQppbnQgbWFpbigpIHsKICAgIHNpemVfdCBOOwogICAgY2luID4+IE47CiAgICB2ZWN0b3I8UG9pbnRDPiBwb2ludChOKTsKICAgIGZvciAoYXV0byYgcG8gOiBwb2ludCkKICAgICAgICBjaW4gPj4gcG8ueCA+PiBwby55OwoKICAgIHN1YjxjcHBfYmluX2Zsb2F0XzUwICA+KHBvaW50LCAiY3BwX2Jpbl9mbG9hdF81MCIgICk7CiAgICBzdWI8Y3BwX2Jpbl9mbG9hdF8xMDAgPihwb2ludCwgImNwcF9iaW5fZmxvYXRfMTAwIiApOwogICAgc3ViPGNwcF9iaW5fZmxvYXRfcXVhZD4ocG9pbnQsICJjcHBfYmluX2Zsb2F0X3F1YWQiKTsKCiAgICBzdWI8Y3BwX2RlY19mbG9hdF81MCAgPihwb2ludCwgImNwcF9kZWNfZmxvYXRfNTAiICApOwogICAgc3ViPGNwcF9kZWNfZmxvYXRfMTAwID4ocG9pbnQsICJjcHBfZGVjX2Zsb2F0XzEwMCIgKTsKCiAgICBzdWI8ZmxvYXQgICAgICAgICAgICAgPihwb2ludCwgImZsb2F0IiAgICAgICAgICAgICApOwogICAgc3ViPGRvdWJsZSAgICAgICAgICAgID4ocG9pbnQsICJkb3VibGUiICAgICAgICAgICAgKTsKICAgIHN1Yjxsb25nIGRvdWJsZSAgICAgICA+KHBvaW50LCAibG9uZyBkb3VibGUiICAgICAgICk7Cn0K
MjAKMjI0IDQzMwo5ODc2NTQzMjEgOTg3NjU0MzIxCjIgMAo2IDQKMzE0MTU5MjY1IDM1ODk3OTMyMwowIDAKLTEyMzQ1Njc4OSAxMjM0NTY3ODkKLTEwMDAwMDAwMDAgMTAwMDAwMDAwMAoxMjQgMjMzCjkgLTYKLTQgMAo5IDUKLTcgMwozMzMzMzMzMzMgLTMzMzMzMzMzMwotOSAtMQo3IC0xMAotMSA1CjMyNCA2MzMKMTAwMDAwMDAwMCAtMTAwMDAwMDAwMAoyMCAwCg==
20
224 433
987654321 987654321
2 0
6 4
314159265 358979323
0 0
-123456789 123456789
-1000000000 1000000000
124 233
9 -6
-4 0
9 5
-7 3
333333333 -333333333
-9 -1
7 -10
-1 5
324 633
1000000000 -1000000000
20 0