#include<bits/stdc++.h>
//#include<iomanip>
#define int long long
#define fore(i, a, b) for( int i = (a); i <= (b); ++ i)
#define repe(i, a, b) for( int i = (a); i >= (b); -- i)
using namespace std;
const int BASE = 1e8;
struct Biger{
vector<int> val; bool neg;
void trim() {
while(val.size() > 1 && val.back() == 0) val.pop_back();
if(val.size() == 1 && val[0] == 0) neg = false;
}
int cmp_abs(const Biger& x) const {
if(val.size() != x.val.size()) return val.size() > x.val.size() ? 1 : -1;
repe(i, val.size()-1, 0) if(val[i] != x.val[i]) return val[i] > x.val[i] ? 1 : -1;
return 0;
}
Biger add(const Biger& x) const {
Biger res; res.val.clear();
int carry = 0, i = 0;
while(i < val.size() || i < x.val.size() || carry) {
if(i < val.size()) carry += val[i];
if(i < x.val.size()) carry += x.val[i];
res.val.push_back(carry % BASE); carry /= BASE; i ++;
} res.trim(); return res;
}
Biger sub(const Biger& x) const {
Biger res; res.val.clear();
int borrow = 0, i = 0;
while(i < val.size()) {
int num = val[i] - borrow;
if(i < x.val.size()) num -= x.val[i];
borrow = 0;
if(num < 0) num += BASE, borrow = 1;
res.val.push_back(num); i ++;
}
res.trim(); return res;
}
Biger mul(const Biger& x) const {
Biger res;
res.val.resize(val.size() + x.val.size(), 0);
for(int i = 0;i < val.size(); i ++) {
int carry = 0;
for(int j = 0; j < x.val.size() || carry; j ++) {
int t = res.val[i + j] + val[i] * (j < x.val.size() ? x.val[j] : 0) + carry;
carry = t / BASE;
res.val[i + j] = t % BASE;
}
} res.trim(); return res;
}
Biger div2() const {
Biger res;
res.val.resize(val.size());
int rem = 0;
for(int i = val.size() - 1; i >= 0; i --) {
int x = val[i] + rem * BASE;
res.val[i] = x / 2;
rem = x % 2;
} res.trim();
res.neg = neg;
return res;
}
Biger div(const Biger& x) const {
if(x.cmp_abs(Biger{}) == 0) {
return Biger{};
}
if(cmp_abs(x) < 0) return Biger{};
Biger l{}, r{*this}, ans{};
while(l.cmp_abs(r) <= 0) {
Biger mid = (l.add(r)).div2();
Biger t = mid.mul(x);
if(t.cmp_abs(*this) <= 0) {
ans = mid;
l = mid.add(Biger{}.fromll(1));
} else {
r = mid.sub(Biger{}.fromll(1));
}
} return ans;
}
Biger mod(const Biger& x) const{
Biger d = div(x);
return sub(d.mul(x));
}
Biger& fromll(int num) {
neg = num < 0; num = llabs(num); val.clear();
if(num == 0) {
val.push_back(0);
return *this;
}
while(num) {
val.push_back(num % BASE);
num /= BASE;
}
return *this;
}
Biger& fromstr(const string& s) {
neg = false; val.clear(); int st = 0;
if(!s.empty() && s[0] == '-') { neg = true; st = 1; }
for(int i = s.size() - 1; i >= st; i -= 8) {
int num = 0, start = max(st, i - 7);
for(int j = start; j <= i; j ++) num = num * 10 + (s[j] - '0');
val.push_back(num);
} trim(); return *this;
}
long long to_ll() const {
Biger max_ll;
max_ll.fromll(LLONG_MAX);
if (this->cmp_abs(max_ll) > 0) {
exit(1);
}
long long res = 0;
for (int i = (int)val.size() - 1; i >= 0; --i) {
res = res * BASE + val[i];
}
return neg ? -res : res;
}
Biger() : neg(false) { val.push_back(0); }
Biger(const Biger& x) = default;
Biger operator-() const {
Biger res = *this;
if(res.cmp_abs(Biger{}) != 0) res.neg = !res.neg;
return res;
}
bool operator==(const Biger& x) const { return neg == x.neg && val == x.val; }
bool operator!=(const Biger& x) const { return !(*this == x); }
bool operator<(const Biger& x) const {
if(neg != x.neg) return neg;
if(neg) return cmp_abs(x) > 0;
return cmp_abs(x) < 0;
}
bool operator>(const Biger& x) const{ return x < *this; }
bool operator<=(const Biger& x) const { return !(*this > x); }
bool operator>=(const Biger& x) const { return !(*this < x); }
Biger& operator+=(const Biger& x) {
if(neg == x.neg) {
*this = add(x);
} else {
int c = cmp_abs(x);
if(c == 0) *this = Biger{};
else if(c > 0) *this = sub(x), this->neg = neg;
else *this = x.sub(*this), this->neg = x.neg;
} trim(); return *this;
}
Biger& operator-=(const Biger& x) { return *this += (-x); }
Biger& operator*=(const Biger& x) { *this = mul(x); neg ^= x.neg; trim(); return *this; }
Biger& operator/=(const Biger& x) { *this = div(x); neg ^= x.neg; trim(); return *this; }
Biger& operator%=(const Biger& x) { *this = mod(x); trim(); return *this; }
Biger operator+(const Biger& x) const { Biger r = *this; r += x; return r; }
Biger operator-(const Biger& x) const { Biger r = *this; r -= x; return r; }
Biger operator*(const Biger& x) const { Biger r = *this; r *= x; return r; }
Biger operator/(const Biger& x) const { Biger r = *this; r /= x; return r; }
Biger operator%(const Biger& x) const { Biger r = *this; r %= x; return r; }
};
ostream& operator<<(ostream& os, const Biger& x) {
if (x.neg) os << '-';
os << x.val.back();
for (int i = (int)x.val.size()-2; i >= 0; --i) {
os << setw(8) << setfill('0') << x.val[i];
}
os << setfill(' ');
return os;
}
std::istream& operator>>(std::istream& is, Biger& x) {
std::string s; is >> s; x.fromstr(s);
return is;
}
Biger a;
signed main()
{
ios::sync_with_stdio(false);
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
cin >> a;
return 0;
}