func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 100005;   const long long M = 1000000007;   const long double PI = acos((long double)-1.0);   template <typename T>   struct SegmentTree {     T data[N << 2];     T calc(const T &x, const T &y) const { return max(x, y); }     void push_up(int rt) { data[rt] = calc(data[rt << 1], data[rt << 1 | 1]); }     void build(int l, int r, int rt) {       data[rt] = 0;       if (l == r) {         return;       }       int m = (l + r) >> 1;       build(l, m, rt << 1);       build(m + 1, r, rt << 1 | 1);     }     void update(int p, T val, int l, int r, int rt) {       if (l == r) {         data[rt] = val;         return;       }       int m = (l + r) >> 1;       if (p <= m) {         update(p, val, l, m, rt << 1);       } else {         update(p, val, m + 1, r, rt << 1 | 1);       }       push_up(rt);     }     T query(int L, int R, int l, int r, int rt) {       if (L > R) {         return 0;       }       if (L <= l && r <= R) {         return data[rt];       }       int m = (l + r) >> 1;       T ret = 0;       if (L <= m) {         ret = calc(ret, query(L, R, l, m, rt << 1));       }       if (m < R) {         ret = calc(ret, query(L, R, m + 1, r, rt << 1 | 1));       }       return ret;     }   };   SegmentTree<long long> st;   int n;   struct Node {     long long v;     int id;   } a[N];   bool cmp(const Node &a, const Node &b) {     return a.v < b.v || (a.v == b.v && a.id > b.id);   }   int main() {     while (~scanf( %d , &n)) {       for (int i = 1; i <= n; i++) {         long long r, h;         scanf( %I64d%I64d , &r, &h);         a[i].v = r * r * h;         a[i].id = i;       }       sort(a + 1, a + n + 1, cmp);       st.build(1, n, 1);       long long ans = a[0].v;       for (int i = 1; i <= n; i++) {         long long val = st.query(1, a[i].id - 1, 1, n, 1);         st.update(a[i].id, val + a[i].v, 1, n, 1);         ans = max(ans, val + a[i].v);       }       printf( %.10f n , double(PI * ans));     }   }   