#include <bits/stdc++.h>
using namespace std;
const int INF = numeric_limits<int>::max();
const long long LLINF = numeric_limits<long long>::max();
const unsigned long long ULLINF = numeric_limits<unsigned long long>::max();
const double PI = acos(-1.0);
int n;
long long r[100010], h[100010];
vector<int> getF;
vector<long long> t;
map<long long, set<int>> cc;
int sz = 1;
void build(int n) {
  while (sz < n) sz <<= 1;
  t.resize(sz + sz, 0);
}
long long query(int v, int tl, int tr, int l, int r) {
  if (l > r) return 0;
  if (tl == l && tr == r) return t[v];
  int tm = (tl + tr) >> 1;
  return max(query(v + v, tl, tm, l, min(tm, r)),
             query(v + v + 1, tm + 1, tr, max(l, tm + 1), r));
}
void update(int i, long long val) {
  i += sz;
  t[i] = val;
  while ((i >> 1) > 0) {
    i >>= 1;
    t[i] = (t[i + i] < t[i + i + 1] ? t[i + i + 1] : t[i + i]);
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> r[i] >> h[i];
    cc[r[i] * r[i] * h[i]].insert(i);
  }
  build(cc.size());
  getF.resize(n, -1);
  int f = 0;
  for (auto k : cc) {
    for (auto r : k.second) getF[r] = f;
    f++;
  }
  for (int i = 0; i < n; i++) {
    if (getF[i] == -1) continue;
    long long volume = r[i] * r[i] * h[i];
    long long add = query(1, 0, sz - 1, 0, getF[i] - 1);
    update(getF[i], volume + add);
  }
  cout << setprecision(10) << fixed << PI * query(1, 0, sz - 1, 0, sz - 1);
  return 0;
}
