111. Very simple problem

time limit per test: 0.25 sec / memory limit per test: 4096 KB

You are given natural number X. Find such maximum integer number that it square is not greater than X.

Input

Input file contains number X (\(1 \le X \le 10^{1000}\)).

Output

Write answer in output file.

Example(s)

Sample Input Sample Output
16
4
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <sstream>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <ctime>

#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define Rep(i, n) for (int i = 1; i <= (n); ++i)
#define clr(x, a) memset(x, (a), sizeof x)
using namespace std;
typedef long long ll;
int const N = 1010;
char buf[N];
int s[N];
struct BigInt {
  int a[N], len;
  void operator += (int const &t) {
    a[0] += t; int l = 0;
    while (a[l] >= 10) {
      a[l + 1] += a[l] / 10;
      a[l] %= 10;
      ++l;
    }
    len = max(len, l + 1);
  }
  void operator -= (BigInt const &B) {
    rep(i, B.len) {
      a[i] -= B.a[i];
      if (a[i] < 0) a[i] += 10, a[i + 1] -= 1;
    }
    for (int i = len - 1; ~i; --i) {
      if (a[i]) {
        len = i + 1;
        break;
      }
    }
  }
  void operator *= (int const &t) {
    rep(i, len) a[i] *= t;
    rep(i, len) {
      a[i + 1] += a[i] / 10;
      a[i] %= 10;
    }
    while (a[len] >= 10) {
      a[len + 1] += a[len] / 10;
      a[len] %= 10;
      ++len;
    }
    if (a[len] > 0) ++len;
  }
  bool operator <= (BigInt const &B) const {
    if (len != B.len) return len < B.len;
    for (int i = len - 1; ~i; --i) {
      if (a[i] != B.a[i]) return a[i] < B.a[i];
    }
    return 1;
  }
  BigInt(int x = 0) {
    len = 0; clr(a, 0);
    while (x) {
      a[len++] = x % 10;
      x /= 10;
    }
    len = max(len, 1);
  }
  void pr() { for (int i = len - 1; ~i; --i) printf("%d", a[i]); puts(""); }
} X, Y, Z;
int main() {
  int n = strlen(gets(buf));
  if (n & 1) { Rep(i, n) s[i] = buf[i - 1] - '0'; ++n; }
  else rep(i, n) s[i] = buf[i] - '0';
  for (int i = 0; i < n; i += 2) {
    X *= 10; Y *= 100; Y += (s[i] * 10 + s[i + 1]);
    for (int t = 9; ~t; --t) {
      Z = X; Z *= (2 * t); Z += (t * t);
      if (Z <= Y) {
        X += t;
        break;
      }
    }
    Y -= Z;
  }
  X.pr();
  return 0;
}