Problem p02881 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <cmath>
#include <iostream>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>

const long long INF = 1000000007;
using namespace std;
typedef long long llong;

// int isalpha(char ch): ch がアルファベットなら true を返す
// int isdigit(char ch): ch が数字なら true を返す
// int islower(char ch): ch が小文字なら true を返す
// int isupper(char ch): ch が大文字なら true を返す
// int tolower(char ch): ch の小文字を返す
// int toupper(char ch): ch の大文字を返す

// string型
// size()	文字数を返す
// Insert()	（指定した場所に）文字・文字列を挿入する
// erase()	（指定した場所の）文字・文字列を削除する
// clear()	すべての文字を削除する
// substr()	文字列の（指定した）部分文字列を返す
// replace()	（指定した）部分文字列を新しい文字列に置換する
// c_str()変換
// 文字列の比較は、<=や==などを使え
// replace関数を使い、簡単に文字列を置換
// リバース関数：reverse(str.begin(), str.end());
// map<type, type> dict;で宣言
// グラフ理論用変数
// vector<vector<llong> > graph(N);

// ソート
// 降順sort(v.begin(), v.end(), std::greater<Type>());

// 大文字から小文字へんかん
// w[i] = w[i]-'A'+'a';

// vector
// assignメソッド　引数：サイズ、値
// 与えられたサイズと値でvectorを初期化する

// queueクラス
// find()次に取り出す値の表示をする。
// pop()値を取り出す。戻り値はなし
// push()キューに値をプッシュする

// priority_queueクラス

// 切り上げ
// ceil
// floor

vector<pair<llong, llong>> Enumdivisor(llong N) {
  vector<pair<llong, llong>> A;
  pair<llong, llong> X;

  for (int i = 1; i * i <= N; i++) {
    if (N % i == 0) {
      X.first = i;
      X.second = N / i;
      A.push_back(X);
    }
  }
  return A;
}

int main() {
  llong N;
  cin >> N;
  llong ans = 10000000000000;
  vector<pair<llong, llong>> divisor_list;
  divisor_list = Enumdivisor(N);
  for (auto x : divisor_list) {
    ans = min(ans, x.first - 2 + x.second);
  }
  cout << ans << endl;
  return 0;
}


Fixed submission:
#include <algorithm>
#include <cmath>
#include <iostream>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>

const long long INF = 1000000007;
using namespace std;
typedef long long llong;

// int isalpha(char ch): ch がアルファベットなら true を返す
// int isdigit(char ch): ch が数字なら true を返す
// int islower(char ch): ch が小文字なら true を返す
// int isupper(char ch): ch が大文字なら true を返す
// int tolower(char ch): ch の小文字を返す
// int toupper(char ch): ch の大文字を返す

// string型
// size()	文字数を返す
// Insert()	（指定した場所に）文字・文字列を挿入する
// erase()	（指定した場所の）文字・文字列を削除する
// clear()	すべての文字を削除する
// substr()	文字列の（指定した）部分文字列を返す
// replace()	（指定した）部分文字列を新しい文字列に置換する
// c_str()変換
// 文字列の比較は、<=や==などを使え
// replace関数を使い、簡単に文字列を置換
// リバース関数：reverse(str.begin(), str.end());
// map<type, type> dict;で宣言
// グラフ理論用変数
// vector<vector<llong> > graph(N);

// ソート
// 降順sort(v.begin(), v.end(), std::greater<Type>());

// 大文字から小文字へんかん
// w[i] = w[i]-'A'+'a';

// vector
// assignメソッド　引数：サイズ、値
// 与えられたサイズと値でvectorを初期化する

// queueクラス
// find()次に取り出す値の表示をする。
// pop()値を取り出す。戻り値はなし
// push()キューに値をプッシュする

// priority_queueクラス

// 切り上げ
// ceil
// floor

vector<pair<llong, llong>> Enumdivisor(llong N) {
  vector<pair<llong, llong>> A;
  pair<llong, llong> X;

  for (int i = 1; i < sqrt(N) + 1; i++) {
    if (N % i == 0) {
      X.first = i;
      X.second = N / i;
      A.push_back(X);
    }
  }
  return A;
}

int main() {
  llong N;
  cin >> N;
  llong ans = 10000000000000;
  vector<pair<llong, llong>> divisor_list;
  divisor_list = Enumdivisor(N);
  for (auto x : divisor_list) {
    ans = min(ans, x.first - 2 + x.second);
  }
  cout << ans << endl;
  return 0;
}