// AtCoder140150c.cpp : Defines the entry point for the console application.
//

//#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <string>
#include <cmath>


//https://kenkoooo.com/atcoder/#/table/

using namespace std;

void func150c()
{
	/*
	vector:動的配列。サイズを意識せずに利用できるように
	拡張されたクラス
	*/
	int n, ans;
    int per_num = 0; //順列の数
	int *array; //next_permutation用。1～nを入れる
	int a_dic = 0; //a,bの順列の辞書順を入れる
	int b_dic = 0; 
	vector<int> a, b; //辞書順の索引？
	vector<vector<int>> per ; //2次元ベクター 順列を入れる
	 
	cin >> n;
	
	array = new int[n];
	for (int i = 0; i < n; i++) array[i] = i + 1;

	for (int i = 0; i < n; i++) {
		int temp;
		cin >> temp;
		a.push_back(temp);
	}
	for (int i = 0; i < n; i++) {
		int temp;
		cin >> temp;
		b.push_back(temp);
	}

	/*
	next_permutation():順列を生成する。
	<algorithm>をインクルードする必要がある。
	指定された配列を辞書順で次の順列に並べ替える。
	返り値はTrue,False。辞書順で次の順列があればTrue,なければFalse.
	これによってdo_whileですべての順列生成ができる（のだと思う)
	参考:https://qiita.com/siser/items/a91022071b24952d27d9
	*/
	do { //順列をすべて生成する
		per.push_back(vector<int>()); //以下で順列を代入するために空のvector<int>を追加
		for (int i = 0; i < n; i++) {
			per[per_num].push_back(array[i]); //per_num番目の末尾に追加
		}
		per_num++; //一つの順列を入れ終えたら、次のベクターに移る
	} while (next_permutation(array, array + n));
	//per_num--; //最後に余計にper_num++が行われてしまうので引きます...


    //デバッグ　数列確認
    /*
    cout << "数列確認\n";
    for (int i = 0; i < per_num; i++) {
        for (int j = 0; j < n; j++) {
            cout << per[i][j] << " ";
        }
        cout << "\n";
    }
    cout << "\n";
    */


	/*
	全ての順列と入力された順列を比較し、
	辞書順で何番目かを調べる
	*/
    //per[i][j]:辞書順でi+1番目の数列の、頭からj+1番目の数字
    //a[j]:調べたい数列のj+1番目の数字
	for (int i = 0; i < per_num; i++) { //辞書順の数だけ回る
		for (int j = 0; j < n; j++) { //数列の数分回る
			if (per[i][j] == a[j]) {
				if (j != n - 1) continue;
				a_dic = i+1;
			}
			break;
		}
	}


	for (int i = 0; i < per_num; i++) {
		for (int j = 0; j < n; j++) {
			if (per[i][j] == b[j]) {
				if (j != n - 1) continue;
				b_dic = i+1;
			}
			break;
		}
	}

	ans = (a_dic - b_dic > 0) ? (a_dic - b_dic) : (b_dic - a_dic);
	cout << ans;
}

void func150c_fix()
{
    int n, ans;
 
    cin >> n;

    int *array; //next_permutation用。1～nを入れる
    array = new int[n];
    for (int i = 0; i < n; i++) array[i] = i + 1;

    int count = 0;
    vector<unsigned long long> per; //順列を入れる
    do { //順列をすべて生成する
        per.push_back(0);
        for (int i = 0; i < n; ++i) {
            per[count] += array[i] * pow(10, n - i - 1);
        }
        ++count;
    } while (next_permutation(array, array + n));
    delete array;

    int a = 0, b = 0;

    for (int i = 0; i < n; ++i) {
        int temp;
        cin >> temp;
        a += temp * pow(10, n - i - 1);
    }

    for (int i = 0; i < n; ++i) {
        int temp;
        cin >> temp;
        b += temp * pow(10, n - i - 1);
    }


    /*
    数列は辞書順、つまり大きさ順で並んでいるので
    調べる数字より小さい数がいくつあるかを調べれば
    辞書順で何番目かもわかる
    */
    
    int count1 = 0;
    int count2 = 0;
    for (int i = 0; per[i] < a; ++i, ++count1);
    for (int i = 0; per[i] < b; ++i, ++count2);

    if (count1 > count2) cout << count1 - count2;
    else cout << count2 - count1;
}


void func149c()
{
	int x, ans;
	int judge; //素数かどうかの判定
	vector<int> prime = { 2 }; //素数を入れる配列

	cin >> x;

	/*
	2はすでに分かっている素数として処理
	*/
	if (x == 2) ans = 2;
	else {
		for(int i = 2; true; i++)
		{
			judge = 0;
			/*
			iを素数ベクターの中の数字全てで割る。
			全て割り切れなければ、iを新しく素数リストに追加する。
			*/
			for (int j = 0; j < prime.size(); j++)
			{
				if (i % prime[j] == 0) break; //割り切れたら素数ではない
				if (j == prime.size() - 1) judge = 1;
				
			}

			if (judge == 1) { //iが素数
				if (i >= x) { //素数iがX以上なら出力へ移る 
					ans = i;
					break;
				}
				/*
				素数numがXより小さければiを素数リストに入れ
				処理を続ける
				*/
				prime.push_back(i);
			}
			
		}

	}

	cout << ans;

}


bool is_prime(int x) {
    if (x <= 1) return false;
    for (int i = 2; i * i <= x; ++i) {
        if (x % i == 0) return false;
    }
    return true;
}

void func149c_fix() {
    int x;
    cin >> x;

    while (!is_prime(x)) ++x;

    cout << x;

}

void func148c()
{
	int a, b;
	unsigned long long  ans = 1; //オーバフロー防止
	vector<int> prime = { 2 };
	vector<int> a_prime, b_prime;
	/*
	a_prime,b_primeには素因数分解での数字の数を数える
	(2の〇乗の〇) 
	*/

	cin >> a;
	cin >> b;

	/* 
	素因数分解のため、a,bで大きい数字までの素数を求める.
	素数の求め方はfunc149cと同じで、判明してる素数で割って確かめる.
	*/
	int limit = (a > b) ? a : b;
	for (int i = 2; i <= limit; i++)
	{
		for (int j = 0; j < prime.size(); j++)
		{
			if (i % prime[j] == 0) break;
			if (j == prime.size() - 1) prime.push_back(i);
		}

	}

	/*
	素因数分解。求めた素数の小さいほうから割っていく
	*/
	for (int i = 0; i < prime.size(); i++)
	{
		a_prime.push_back(0); //i番目の素数で何回割れるか確かめる
		while (true) //prime[i]で割れるだけ割る
		{
			if (a % prime[i] != 0) break;
			a /= prime[i];
			a_prime[i]++;
		}

	}

	for (int i = 0; i < prime.size(); i++)
	{
		b_prime.push_back(0); //i番目の素数で何回割れるか確かめる
		while (true) //prime[i]で割れるだけ割る
		{
			if (b % prime[i] != 0) break;
			b /= prime[i];
			b_prime[i]++;
		}

	}

	/*
	最小公倍数を求める。それぞれの素数で、
	カウントしておいた割ったの回数が多い方を用いる
	「素数のカウント乗」を掛け合わせた数字が最小公倍数
	*/
	for (int i = 0; i < prime.size(); i++)
	{
		int num1 = prime[i];
		int num2 = (a_prime[i] > b_prime[i]) ? a_prime[i] : b_prime[i];
		if (num2 == 0) continue;
		ans *= pow(num1, num2);
	}

	cout << ans;
}

int gcd(int p, int q) {
    if (p%q != 0) return gcd(q, p%q);
    else return q;
}


void func148c_fix() {
    /*
    ユークリッドの互除法を使って解く
    最大公約数が簡単に求められる
    そこから
    a*b = 2数の最大公約数 * 2数の最小公倍数
    の公式を使って求める
    */

    long long a, b;
    cin >> a;
    cin >> b;

    cout << a * b / gcd(a, b);
}

void func147c()
{
    int n;
    cin >> n;


    vector<vector<int>> a(n, vector<int>(n));
    //証言を-1で初期化
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            a[i][j] = -1;
        }
    }

    for (int i = 0; i < n; ++i) {
        int temp;
        cin >> temp; //証言の数
        for (int j = 0; j < temp; ++j) {
            int x, y;
            cin >> x;
            cin >> y;
            a[i][x] = y;
        }
    }

    /*
    証言の組み合わせを全通り探索
    全員正直者から始め、成立しないなら正直者を減らしていく
    正直者・不親切な人は１と０で表せるので
    2進数11111・・・で始め、1ずつ減らしていけば全通り探索できるはず
    成立し次第その人数を出力して終わり
    */

    int bin = pow(2, n) - 1;
    vector<int> syogen(n);
    while (bin > 0) {
        //証言ベクター更新
        int temp = bin;
        for (int i = 0; i < n; ++i) {
            int temp2 = pow(2, n - 1 - i);
            if (temp/temp2 > 0) syogen[i] = 1;
            else syogen[i] = 0;
            temp %= temp2;
        }


        /*
        cout << bin << "\n";
        for (int i = 0; i < n; ++i) {
            cout << syogen[i] << " ";
        }
        cout << "\n\n";
        */

        //証言を調べる
        int judge = 1;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                int temp = a[i][j]; //証言を取り出す
                if (temp == -1) continue; //-1は証言なしとして飛ばす
                if (syogen[i] != temp) {//証言に食い違いが出たら間違いなのでbreak
                    judge = 0;
                    break;
                }
            }
            if (judge == 0) break;
        }

        if (judge == 1) break; //judge==1ならbreak
        --bin; //judge==0なら--bin、正直者の組み合わせを変えてもう一回
    }

    int ans = 0;
    for (int i = n; i > 0; --i) {
        int temp = pow(2, i - 1);
        if (bin /temp > 0) ++ans;
        bin %= temp;
    }

    cout << ans;
    

}

int check_keta(int ans) {

    int count = 0;
    while (ans > 0) {
        ans /= 10;
        ++count;
    }

    return count;
}

long long  keta_min(int keta) {

    /*
    その桁での最小支払額
    1桁の時は0.pow(10, 0)だと１になってしまうので対応
    */
    if (keta == 1) return 0;
    else return pow(10, keta - 1);
}

void func146c()
{
	unsigned long long a, b;
	unsigned long long x;

	cin >> a;
	cin >> b;
	cin >> x;

	/*
    まず桁数を調べる
	10桁(10^9)で始まり、X円で払いきれるか調べる
	払えなかったら桁数を減らしていく
	*/

    unsigned long long ans; //求めたいN

	for (int keta = 10; keta >= 0; --keta) {
        
        if (keta == 0) {
            ans = 0;
            break;
        }
        //pow(10, keta-1)
		if (x < a * keta_min(keta) + b * keta) continue; //払いきれない

        /*
        (x - b * keta) / a >= N が成り立つ最大のNが求めたいN
        ただし 1 <= N <= 10^9
        */
        ans = (x - b * keta) / a;
        if (ans >= pow(10, 9)) ans = pow(10, 9);
        break;

	}

    cout << ans;
}

long long price(long long a, long long b, long long n) {

    //整数nがいくらかを調べる
    int keta = 0;
    long long temp = n;
    while (temp > 0) {//整数nの桁数を調べる
        temp /= 10;
        ++keta;
    }
    
    return a * n + b * keta;

}

bool isOK(long long mid, long long x) {
    if (x >= mid) return true; //所持金で整数midは買える
    else return false; //所持金で整数midは買えない

}

long long binary_search(long long a, long long b, long long x) {

    long long left = 0; //買える側 
    long long right = pow(10, 9) + 1; //買えない側。すべて変える可能性もあるので本来より高い+1しておく

    while (right - left > 1) {
        long long mid = (left + right) / 2;

        //cout << left << " " << mid << " " << right << "\n";
        if (isOK(price(a, b, mid), x)) left = mid; //買えるので左端値段をあげる
        else right = mid; //買えないので右端の値段を下げる
    }

    return left;
}

void func146cfix() {

   //2分探索で解いてみる

    long long a, b, x;
    cin >> a >> b >> x;

    cout << binary_search(a, b, x);
}



void func145c()
{
    int n;

    cin >> n;
    vector<int> x, y;
    for (int i = 0; i < n; ++i) {
        int temp;
        cin >> temp;
        x.push_back(temp);
        cin >> temp;
        y.push_back(temp);
    }

    /*
    N!通りの経路を全て挙げると、各道を同じ回数通っている
    つまり求める値は　
    (各道の長さの総和 * 通った回数)/ 経路の総数
    で求められる。
    */

    //各道の長さの総和を求める
    double length = 0;
    for (int i = 0; i < n-1; ++i) {
        for (int j = i + 1; j < n; ++j) {
            length += sqrt( pow(x[i] - x[j], 2) + pow(y[i] - y[j], 2));
        }
    }

    /*
    通った回数は
    経路の総数 * 1回の町巡りで道を通る回数 / 道の数
    N! * (N-1) / N_C_2(コンビネーションのC)
    で求められる。
    */
    //これまでの式を計算するとN!が消える
    int comb = 1;
    for (int i = n; i > n - 2; --i) comb *= i;
    double ans = 2 * length * (n - 1) / comb;

    cout << fixed << setprecision(10) << ans;

}

void func144c()
{
    long long n;
    
    cin >> n;

    /* 
    i*j=N となるi,jを調べる.
    移動量i+j-2を配列に格納する.
    */

    vector<long long> move;
    for (int i = 1; i <= sqrt(n); ++i) {
        if (n % i == 0) move.push_back(i + (n / i) - 2);
    }

    //初期値10^12でより小さい移動量が出るたびに更新
    long long ans = pow(10, 12);
    for (int i = 0; i < move.size(); ++i) {
        if (ans >= move[i]) ans = move[i];
    }

    cout << ans;

}

void func143c() 
{
    int n;
    cin >> n;
    string s;
    cin >> s;

    int slime = 1;
    for (int i = 0; i < n - 1; ++i) {
        if (s[i] != s[i + 1]) ++slime;
    }

    cout << slime;

}

void func142c()
{
    int n;
    cin >> n;
    vector<int> student(n, 0);
    //入力の時点で生徒を登校順に配列に格納する
    for (int i = 0; i < n; ++i) {
        int temp;
        cin >> temp;
        student[temp - 1] = i + 1;
    }

    for (int i = 0; i < n; ++i) {
        cout << student[i];
        if (i != n - 1) cout << " ";
    }

}

void func141c() 
{
    int n, k, q;
    cin >> n;
    cin >> k;
    cin >> q;

    //あらかじめポイントを引き、後から正答者にポイントを加算する
    vector<int> point(n, k-q);
    for (int i = 0; i < q; ++i) {
        int temp;
        cin >> temp;
        ++point[temp - 1];
    }

    for (int i = 0; i < n; ++i) {
        if (point[i] > 0) cout << "Yes";
        else cout << "No";
        if (i != n - 1) cout << "\n";
    }

}

void func140c()
{
    int n;
    cin >> n;
    vector<int> b(n - 1, 0);
    for (int i = 0; i < n - 1; ++i) cin >> b[i];

    int sum = 0;
    for (int i = 0; i < n; ++i) {
        if (i == 0) {
            sum += b[i];
        }
        else if (i == n - 1) {
            sum += b[i - 1];
        }
        else {
            sum += (b[i - 1] < b[i]) ? b[i - 1] : b[i];
        }
     }

    cout << sum;

}

void test() {
    int bin = 0b1111;

    cout << bin << "\n";
    int mod = bin % 2;
    cout << mod << "\n";
}

int main()
{
	
  //do it!

	//func150c();
    //func150c_fix();
	//func149c();
    //func149c_fix();
	//func148c();
    //func148c_fix();
	//func147c();
	//func146c();
    //func146cfix();
    //func145c();
    func144c();
    //func143c();
    //func142c();
    //func141c();
   // func140c();
    //test();
    return 0;
}



Measured memory_bytes: 384