func_code_string: #include <bits/stdc++.h>   using namespace std;   ;   const long long maxn = 1e5 + 7;   const long double pi = 3.14159265358979323846;   struct pirog {     long long r;     long long h;     long long i;   };   long long V[4 * maxn];   pirog A[maxn];   vector<pirog> C;   void update(long long v, long long tl, long long tr, long long i,               long long color) {     if (tl == tr) {       V[v] = color;       return;     }     long long tm = (tl + tr) / 2;     if (tm >= i) {       update(2 * v, tl, tm, i, color);     } else {       update(2 * v + 1, tm + 1, tr, i, color);     }     V[v] = max(V[2 * v], V[2 * v + 1]);   }   long long mx(long long v, long long tl, long long tr, long long l,                long long r) {     if (tl > r || l > tr) {       return 0;     }     if (tl == l && tr == r) {       return V[v];     }     long long tm = (tl + tr) / 2;     return max(mx(2 * v, tl, tm, l, min(tm, r)),                mx(2 * v + 1, tm + 1, tr, max(l, tm + 1), r));   }   bool cmp(pirog a, pirog b) { return a.h * a.r * a.r < b.h * b.r * b.r; }   long long X[maxn];   int main() {     long long q, w, e, k, n;     cin >> n;     cout << fixed << setprecision(10);     for (q = 0; q < n; q++) {       cin >> A[q].r >> A[q].h;       A[q].i = q;       C.push_back(A[q]);     }     sort(C.begin(), C.end(), cmp);     long long l = 0;     for (q = 0; q < n; q++) {       long long x = mx(1, 0, n - 1, 0, C[q].i) + C[q].h * C[q].r * C[q].r;       X[q] = x;       if (C[q].r * C[q].r * C[q].h == C[q + 1].r * C[q + 1].r * C[q + 1].h) {         continue;       }       for (w = l; w <= q; w++) {         update(1, 0, n - 1, C[w].i, X[w]);       }       l = q + 1;     }     cout << mx(1, 0, n - 1, 0, n - 1) * pi;     return 0;   }   