func_code_string: #include <bits/stdc++.h>   using namespace ::std;   const long double PI = acos(-1);   const long long MOD = 1000000000 + 7;   long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }   long long add(long long a, long long b, long long m = MOD) {     return (a % m + b % m + 2 * m) % m;   }   long long mul(long long a, long long b, long long m = MOD) {     return ((a % m + m) * (b % m + m)) % m;   }   long long pow_mod(long long a, long long b, long long m = MOD) {     long long res = 1LL;     a = a % m;     while (b) {       if (b & 1) res = mul(res, a, m);       b >>= 1;       a = mul(a, a, m);     }     return res;   }   long long fastexp(long long a, long long b) {     long long res = 1LL;     while (b) {       if (b & 1) res = res * a;       b >>= 1;       a *= a;     }     return res;   }   int gcdExtendido(int a, int b, int *x, int *y) {     if (a == 0) {       *x = 0;       *y = 1;       return b;     }     int x1, y1;     int gcd = gcdExtendido(b % a, a, &x1, &y1);     *x = y1 - (b / a) * x1;     *y = x1;     return gcd;   }   int modInverso(int a, int m) {     int x, y;     int g = gcdExtendido(a, m, &x, &y);     if (g != 1)       return -1;     else       return (x % m + m) % m;   }   const int N = 100000 + 5;   struct line {     long long m;     long long b;     line(long long _m, long long _b) {       m = _m;       b = _b;     }   };   int n;   int a[N];   int b[N];   long long dp[N];   vector<line> ConvexHull;   bool l2IsUseless(line l1, line l2, line l3) {     return 1.0l * (l3.b - l1.b) * (l2.m - l1.m) >=            1.0L * (l2.b - l1.b) * (l3.m - l1.m);   }   void add_line(line x) {     int len = ConvexHull.size();     while (len >= 2 and            l2IsUseless(ConvexHull[len - 2], ConvexHull[len - 1], x)) {       ConvexHull.pop_back();       len--;     }     ConvexHull.push_back(x);   }   long long f(int i, long long x) {     return ConvexHull[i].m * x + ConvexHull[i].b;   }   long long getMinimum(long long x) {     int lo = 0, hi = int(ConvexHull.size()) - 1;     while (lo < hi) {       int mi = lo + (hi - lo) / 2;       if (f(mi, x) >= f(mi + 1, x))         lo = mi + 1;       else         hi = mi;     }     return f(lo, x);   }   int main() {     scanf( %d , &(n));     for (int i = 0; i < n; i++) {       scanf( %d , &(a[i]));     }     for (int i = 0; i < n; i++) {       scanf( %d , &(b[i]));     }     dp[0] = 0LL;     add_line(line(b[0], dp[0]));     for (int i = 1; i < n; i++) {       dp[i] = getMinimum(a[i]);       add_line(line(1LL * b[i], dp[i]));     }     printf( %lld n , dp[n - 1]);     return 0;   }   