func_code_string: #include <bits/stdc++.h>   using namespace std;   long long t[4 * 100100], dp[100100], a[100100], b[100100];   long long K = 1, n, m;   void build() {     while (K < m + 2) K <<= 1;   }   long long query(long long l, long long r) {     long long ans = 0;     for (l += K - 1, r += K + 1; l ^ r ^ 1; l >>= 1, r >>= 1) {       if (~l ^ 1) ans = ((ans) >= (t[l + 1]) ? (ans) : (t[l + 1]));       if (r ^ 1) ans = ((ans) >= (t[r - 1]) ? (ans) : (t[r - 1]));     }     return ans;   }   void update(long long id, long long v) {     for (t[id += K] = v, id >>= 1; id >= 1; id >>= 1)       t[id] = max(t[id << 1 | 1], t[id << 1]);   }   long long get_id(long long x) {     long long l = 1, r = m, mid;     while (l < r) {       mid = (l + r + 1) >> 1;       if (b[mid] > x)         r = mid - 1;       else         l = mid;     }     return l;   }   void unique() {     m = 1;     for (long long i = 2; i <= n; i++)       if (b[i] != b[m]) b[++m] = b[i];   }   void input() {     scanf( %I64d , &n);     for (long long i = 1, r, h; i <= n; i++) {       scanf( %I64d%I64d , &r, &h);       a[i] = b[i] = r * r * h;     }     return;   }   void init() {     sort(b + 1, b + n + 1);     unique();     build();     return;   }   void work() {     for (long long i = 1; i <= n; i++) {       long long id = get_id(a[i]);       dp[i] = query(1, id - 1) + a[i];       update(id, dp[i]);     }     return;   }   void output() {     printf( %.15lf , query(1, m) * M_PI);     return;   }   int main() {     input();     init();     work();     output();     return 0;   }   