#include <bits/stdc++.h>   using namespace std;   long long tree[400005];   int n;   long long r[100005], h[100005], v[100005];   pair<long long, int> p[100005];   int mp[100005];   void update(int nd, int bb, int ee, int ii, long long vv) {     if (bb == ee && bb == ii) {       tree[nd] = vv;       return;     }     if (bb > ii || ee < ii) return;     int ll = nd << 1, rr = ll | 1, mm = (bb + ee) >> 1;     update(ll, bb, mm, ii, vv);     update(rr, mm + 1, ee, ii, vv);     tree[nd] = max(tree[ll], tree[rr]);     return;   }   long long query(int nd, int bb, int ee, int ii, int jj) {     if (jj < ii) return 0;     if (bb >= ii && ee <= jj) return tree[nd];     if (bb > jj || ee < ii) return 0;     int ll = nd << 1, rr = ll | 1, mm = (bb + ee) >> 1;     return max(query(ll, bb, mm, ii, jj), query(rr, mm + 1, ee, ii, jj));   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(nullptr);     cin >> n;     for (int i = 0; i < n; i++) {       cin >> r[i] >> h[i];       p[i] = {r[i] * r[i] * h[i], i};     }     sort(p, p + n);     for (int i = 0, ii = 0; i < n; i++) {       if (i > 0 && p[i].first == p[i - 1].first) ii--;       mp[p[i].second] = ii;       ii++;     }     for (int i = 0; i < n; i++) {       update(1, 0, n - 1, mp[i],              r[i] * r[i] * h[i] + query(1, 0, n - 1, 0, mp[i] - 1));     }     cout << fixed << setprecision(9) << double(tree[1]) * acos(-1.0) <<   n ;     return 0;   }   