#include <algorithm>
#include <complex>
#include <vector>
using namespace std;
const double eps = 1e-10;
#define EQ(a, b) (abs((a) - (b)) < eps)
using P = complex<double>;      // position
struct L : vector<P> {
    L(const P &a = P(), const P &b = P()) {
        emplace_back(a); emplace_back(b);
    }
};
using Polygon = vector<P>;
ostream &operator<<(ostream &os, P p) { return os << real(p) << " " << imag(p); }
double dot(const P &a, const P &b) { return real(conj(a) * b); }
double cross(const P &a, const P &b) { return imag(conj(a) * b); }

enum CCW_RESULT { CCW = +1, CW = -1, BEHIND = +2, FRONT = -2, ON = 0 };
int ccw(P a, P b, P c) {
    b -= a; c -= a;
    if (cross(b, c) > eps) return CCW;      // counter clockwise
    if (cross(b, c) < -eps) return CW;      // clockwise
    if (dot(b, c) < 0) return BEHIND;       // c--a--b on line
    if (norm(b) < norm(c)) return FRONT;    // a--b--c on line | a=b
    return ON;                              // on segment | a=c | b=c
}
#define curr(ps, i) ps[(i) % ps.size()]
#define next(ps, i) ps[(i + 1) % ps.size()]
#define prev(ps, i) ps[(i + ps.size() - 1) % ps.size()]
bool is_convex(const Polygon &ps) {
    for (int i = 0; i < ps.size(); i++) {
        if (ccw(prev(ps, i), curr(ps, i), next(ps, i)) == -1) return false;
    }
    return true;
}

#include <iostream>
#include <iomanip>
int main() {
    cout << fixed << setprecision(1);
    int n; cin >> n;
    Polygon ps;
    for (int i = 0; i < n; i++) {
        int x, y; cin >> x >> y;
        ps.emplace_back(x, y);
    }
    cout << is_convex(ps) << endl;
    return 0;
}
