using System;
using System.Numerics;
using System.Linq;
using System.Collections.Generic;
namespace Atcoder20190616
{
class ProgramA
{
static void Main(string args)
{
//入力
int n = int.Parse(Console.ReadLine());
//奇数なら(n+1)/2、偶数ならn/2。intは切り捨てなのでこれで解答可能
Console.WriteLine((n + 1) /2);
}
}
class ProgramB
{
static void Main(string args)
{
//入力
int[,] bingo = new int[3,3];
int[,] hit = new int[3,3];
//ビンゴ作成
for(int i = 0; i < 3;i++)
{
string input = Console.ReadLine().Split(' ');
bingo[0,i] = int.Parse(input[0]);
bingo[1,i] = int.Parse(input[1]);
bingo[2,i] = int.Parse(input[2]);
}
int n = int.Parse(Console.ReadLine());
//当たったかどうか確認
for(int i = 0;i < n ;i++)
{
int num = int.Parse(Console.ReadLine());
for(int i = 0;i < 3;i++)
for(int j = 0;j < 3;j++)
{
if(bingo[i,j] == num)
{
hit[i,j] = 1;
break;
}
}
}
//縦横のあたりを見る
for(int i = 0;i < 3 ;i++)
{
if(hit[i,0] == 1 && hit[i,1] == 1 && hit[i,2] == 1)
{
Console.WriteLine("Yes");
return;
}
if(hit[0,i] == 1 && hit[1,i] == 1 && hit[2,i] == 1)
{
Console.WriteLine("Yes");
return;
}
}
//斜めのあたりを見る
if(hit[0,0] == 1 && hit[1,1] == 1 && hit[2,2] == 1)
{
Console.WriteLine("Yes");
return;
}
if(hit[2,0] == 1 && hit[1,1] == 1 && hit[0,2] == 1)
{
Console.WriteLine("Yes");
return;
}
//ないならNo
Console.WriteLine("No");
}
}
class ProgramC
{
static void Main(string args)
{
//入力
string input = Console.ReadLine().Split(' ');
int n = int.Parse(input[0]);
int m = int.Parse(input[1]);
//初期設定
int keta1 = 10;
int keta2 = 10;
int keta3 = 10;
if(n == 1)
{ //n=1のとき
for(int i = 0;i < m;i++)
{
string input = Console.ReadLine().Split(' ');
int keta = int.Parse(input[0]);
int m_i = int.Parse(input[1]);
if(keta1 != m_i && keta1 != 10) //1桁目に2つの数が入ったらあり得ない
{
Console.WriteLine("-1");
return;
}
keta1 = m_i;
}
//候補がないなら0になる
if(keta1 == 10)
keta1 = 0;
Console.WriteLine(keta1);
}
else if(n == 2)
{
//n=2のとき
for(int i = 0;i < m;i++)
{
string input = Console.ReadLine().Split(' ');
int keta = int.Parse(input[0]);
int m_i = int.Parse(input[1]);
if(keta == 1 && m_i == 0)
{
Console.WriteLine("-1");
return;
}
if(keta == 1)
{
if(keta1 != m_i && keta1 != 10)
{
Console.WriteLine("-1");
return;
}
keta1 = m_i;
}
else
{
if(keta2 != m_i && keta2 != 10)
{
Console.WriteLine("-1");
return;
}
keta2 = m_i;
}
}
if(keta1 == 10)
keta1 = 1;
if(keta2 == 10)
keta2 = 0;
Console.WriteLine(keta1*10 + keta2);
}
else
{
//n=3のとき
for(int i = 0;i < m;i++)
{
string input = Console.ReadLine().Split(' ');
int keta = int.Parse(input[0]);
int m_i = int.Parse(input[1]);
if(keta == 1 && m_i == 0)
{
Console.WriteLine("-1");
return;
}
if(keta == 1)
{
if(keta1 != m_i && keta1 != 10)
{
Console.WriteLine("-1");
return;
}
keta1 = m_i;
}
else if(keta == 2)
{
if(keta2 != m_i && keta2 != 10)
{
Console.WriteLine("-1");
return;
}
keta2 = m_i;
}
else
{
if(keta3 != m_i && keta3 != 10)
{
Console.WriteLine("-1");
return;
}
keta3 = m_i;
}
}
if(keta1 == 10)
keta1 = 1;
if(keta2 == 10)
keta2 = 0;
if(keta3 == 10)
keta3 = 0;
Console.WriteLine(keta1*100 + keta2*10 + keta3);
}
}
}
class ProgramD
{
static void Main(string args)
{
//入力
string input = Console.ReadLine().Split(' ');
int n = int.Parse(input[0]);
int m = int.Parse(input[1]);
int k = int.Parse(input[2]);
int count = new int[n];
UnionFind tree = new UnionFind();//UnionFindクラスを設定
tree.par = new int[n];
tree.temp = new int[n];
tree.reset(n);
//友だちの輪をUnion-find法で決める
for(int i = 0;i < m;i++)
{
string input2 = Console.ReadLine().Split(' ');
int x = int.Parse(input2[0]);
int y = int.Parse(input2[1]);
tree.unite(x-1, y-1); // xの木とyの木を併合する
//友だち同士は候補にならないので引く
count[x-1]--;
count[y-1]--;
}
//要素数-1を足し合わせる。(前のところで友だちは除いているので友だち候補のみ残る)
for(int i= 0;i< n;i++)
count[i] += tree.size(i) - 1;
//ブロック関係を洗い出す。もし友だち候補でブロック関係なら引く
for(int i = 0;i < k;i++)
{
string input3 = Console.ReadLine().Split(' ');
int x = int.Parse(input3[0]);
int y = int.Parse(input3[1]);
if(tree.same(x-1,y-1) == true)
{
count[x-1]--;
count[y-1]--;
}
}
//答え出力
for(int i = 0;i < n;i++)
{
Console.Write(count[i]);
Console.Write(" ");
}
}
}
/*UnionFind法のクラス*/
class UnionFind
{
public int par;
public int[] temp;
//マイナスは根を示す。
public void reset(int n)
{
for(int i = 0;i < n;i++)
par[i] = -1;
}
//マイナスならそれはまだ属していないので根である。そうでないならさかのぼる
public int root(int x)
{
if(par[x] < 0)
return x;
else
return root(par[x]);
}
//根の併合を行い、根には要素数を足す(マイナスの値)
public void unite(int x, int y)
{ // xとyの木を併合
int rx = root(x); //xの根をrx
int ry = root(y); //yの根をry
if (rx == ry)
return; //xとyの根が同じ(=同じ木にある)時はそのまま
if(par[ry] > par[rx])
{
int temp = ry;
ry = rx;
rx = temp;
}
par[ry] += par[rx];
par[rx] = ry; //xとyの根が同じでない(=同じ木にない)時:xの根rxをyの根ryにつける
}
// 2つのデータx, yが属する木が同じならtrueを返す
public bool same(int x, int y)
{
int rx = root(x);
int ry = root(y);
return rx == ry;
}
//根の元に入っている
public int size(int x)
{
return -par[root(x)];
}
}
}