Go: package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

var sc = bufio.NewScanner(os.Stdin)

func main() {
	sc.Scan()
	F, _ := strconv.Atoi(sc.Text())
	fmt.Println((F - 30) /2)
}

C++: #include <bits/stdc++.h>
using namespace std;

int main() {
    int c;
    cin >> c;
    cout << (c-30)/2 << endl;
    return 0;
}

C++: #include <iostream>
using namespace std;

int main()
{
	int f;
	cin >> f;
	cout << (f - 30) / 2 << endl;
	return 0;
}

C++: #include<bits/stdc++.h>
using namespace std;
int main(void){
	int f;
	cin >> f;
	cout << (f - 30) / 2 << endl;
	return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;
int main(){
    int F;
    cin>>F;
    int C;
    C=(F-30)/2;
    cout<<C<<endl;
}

C++: #include <stdio.h>
int main(void){
    int F;
    scanf("%d", &F);
    printf("%d\n", (F-30)/2);
}

C++: #include<iostream>
using namespace std;
int main(void)
{
int F;
cin >> F;
cout  << (F-30)/2 << endl;
}

C++: #include <iostream>
using namespace std;
int main(void){
    int x;
    cin>>x;
    cout<<(x-30)/2<<endl;
    
}

C++: #include <iostream>
using namespace std;

int main() {
	int F;
	cin >> F;
	cout << (F - 30) / 2 << endl;
}

C++: //#pragma once
#include <stdio.h>
#include <string>
#include <iostream>
#include <queue>
#include <algorithm>
#include <sstream>
#include <vector>
#include <math.h>
#include <set>
#include <map>
#include <numeric>
#include <bitset>
#include <iomanip>
#include <cctype>


using namespace std;
#define modd 1000000007


typedef pair<long long, long long> pl;


typedef string::const_iterator State;
class ParseError {};




#define ll long long




/*
class UnionFind {
public:
	vector <ll> par;
	vector <ll> siz;
	vector <ll> gr;

	// Constructor
	UnionFind(ll sz_) : par(sz_), siz(sz_, 1LL) ,gr(sz_){
		for (ll i = 0; i < sz_; ++i) par[i] = i;
	}
	void init(ll sz_) {
		par.resize(sz_);
		siz.assign(sz_, 1LL);  // resize だとなぜか初期化されなかった
		for (ll i = 0; i < sz_; ++i) par[i] = i; // 初期では親は自分自身
	}

	// Member Function
	// Find
	ll root(ll x) { // 根の検索
		while (par[x] != x) {
			x = par[x] = par[par[x]]; // x の親の親を x の親とする
		}
		return x;
	}

	// Union(Unite, Merge)
	bool merge(ll x, ll y) {
		x = root(x);
		y = root(y);
		if (x == y) return false;

		// merge technique（データ構造をマージするテク．小を大にくっつける）
		if (siz[x] < siz[y]) swap(x, y);
		siz[x] += siz[y];
		par[y] = x;
		return true;
	}



	bool issame(ll x, ll y) { // 連結判定
		return root(x) == root(y);
	}

	ll size(ll x) { // 素集合のサイズ
		return siz[root(x)];
	}


};*/


long long N, M, K, a, b, c, d, e, H, W, L;
ll A[2][100005] = {};
ll B[2][100005] = {};
ll C[200005] = {};
bool f, ff;
string S;
set <long long>sll;
pl bufpl;
vector <long long>vl[3];
vector <pl>vpl;
vector <string> vs;
set<ll> llset;

/*struct ST
{
	long long Kati;
	int bangou;

	bool operator<(const ST& another) const
	{
		return Kati < another.Kati;//比較
	};

};



vector <ST> vst;
ST st[200005];
ST bufst;
bitset<5000> bits;*/


long long modinv(long long aa, long long mm) {
	long long bb = mm, uu = 1, vv = 0;
	while (bb) {
		long long tt = aa / bb;
		aa -= tt * bb; swap(aa, bb);
		uu -= tt * vv; swap(uu, vv);
	}
	uu %= mm;
	if (uu < 0) uu += mm;
	return uu;
}



ll minn, maxx;
double ansa;
bool fl[30] = {};

string ss, sss;

int main() {


	cin >> a;

	cout << (a - 30) / 2 << endl;

	return 0;

}

C++: #include <iostream>
using namespace std;
int main(){
    int F;
    int C;
    
    
    
    cin>>F;
    cin>>C;
    C=(F-30)/2;
    cout<<(F-30)/2<<endl;
     
     
     
    
    
   
   
   return 0;
}

C++: #include <iostream>
using namespace std;
int main(void){
int F;
cin>>F;
cout<<(F-30)/2<<endl;
}

C++: #include <bits/stdc++.h>
using namespace std;

int main()
{
    int f;
    cin >>f;
    cout <<(f-30)/2<<endl;

    return 0;
}

C++: #include <iostream>
#include <algorithm>
#include <string>
using namespace std;

int main() {
    int c, f;
    cin >> f;
    cout << (f - 30)/2 << endl;

    return 0;
}

C++: #include <iostream>

using namespace std;

int main() {
    int n;
    cin >> n;
    cout << (n - 30) / 2 << endl;
    return 0;
}

C++: #define _USE_MATH_DEFINES
#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <bitset>
#include <utility>
#include <numeric>

using namespace std;

using ll = long long;
using ull = unsigned long long;

const ll inf = (ll)1e9;
const ll mod = (ll)1e9 + 7;

int main()
{
	int f;
	cin >> f;

	cout << (f - 30) / 2 << endl;
}

C++: #include <iostream>
using namespace std;

int main(){
    int F;

    cin >> F;

    cout << (F-30)/2 << endl;

    return 0;
}

C++: #include "bits/stdc++.h"
using namespace std;
typedef long long ll;
#define INF (1<<30)
#define INFLL (1ll<<60)
typedef pair<int, int> P;
typedef pair<int, P> E;
#define MOD (1000000007ll)
#define l_ength size

void mul_mod(ll& a, ll b){
	a *= b;
	a %= MOD;
}

void add_mod(ll& a, ll b){
	b += MOD;
	a += b;
	a %= MOD;
}

int main(void){
	int f;
	cin >> f;
	cout << ((f-30)/2) << endl;
	return 0;
}

C++: #include<iostream>
using namespace std;
int main() {
int F;
cin >> F;
cout << (F-30)/2 << endl;
}

C++: #include <iostream>
using namespace std;

int main() {
	int F; cin >> F;
	cout << (F - 30) / 2 << endl;
	return 0;
}

C++: #include "bits/stdc++.h"
using namespace std;

#define ASC(vec) vec.begin(), vec.end()    // 昇順ソート 例：sort(ASC(vec));
#define DESC(vec) vec.rbegin(), vec.rend() // 降順ソート 例：sort(DESC(vec));
#define rep(i, n) for (int i = 0; i < (n); i++)
#define Rep(i, n) for (int i = 1; i < n; i++)
#define REP(i, vec) for (auto i = vec.begin(); i != vec.end(); ++i)

const int       mod = 1000000007;
const int       inf = (1 << 21);
const long long INF = 1LL << 60;

using ll = long long;
using ii = pair<int, int>;
using vi = vector<int>;
using vd = vector<double>;
using vb = vector<bool>;
using vl = vector<ll>;
using vs = vector<string>;
using vvi = vector<vector<int>>;
using vvl = vector<vector<ll>>;
using vvb = vector<vector<bool>>;
using vii = vector<pair<int, int>>;
using vll = vector<pair<ll, ll>>;

template<class T>
inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }
template<class T>
inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }
template<class T>
T GCD(T a, T b) { if (b == 0) return a; else return GCD(b, a % b); }
template<class T>
T LCM(T a, T b) { return a / GCD(a, b) * b; }

constexpr array<int, 9> dx = { 0, 1, 0, -1, -1, 1, 1, -1, 0 };
constexpr array<int, 9> dy = { 1, 0, -1, 0, 1, 1, -1, -1, 0 };

// ──────────────────────────────────────────────────────────────────

int main() {
	int f;
	cin >> f;

	cout << (f - 30) / 2 << endl;
}

C++: #include <iostream>

using namespace std;
int main(){
    int f;
    cin >>f;
    cout << (f - 30)/2<<endl;
}

C++: // 2019/03/07 Tazoe

#include <iostream>
using namespace std;

int main()
{
	int F;
	cin >> F;

	int C = (F-30)/2;

	cout << C << endl;

	return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<ll,ll> P;

const double PI = 3.14159265358979323846;
const double EPS = 1e-12;
const ll INF = 1LL<<29;
const ll mod = 1e9+7;

#define rep(i, a, b) for(ll (i) = (a); (i) < (b);++i)

int main() {
	ll F;
	cin >> F;
	cout << (F - 30) / 2 << endl;
	return 0;
}