#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;
}
