solution

$O(QN)$で愚直にやる。

底面の位置を動かして足して引いてをする。 $v(r,h) = \frac{\pi r^2 h}{3}$である。

implementation

#define _USE_MATH_DEFINES
#include <iostream>
#include <vector>
#include <cmath>
#define repeat(i,n) for (int i = 0; (i) < (n); ++(i))
typedef long long ll;
using namespace std;
int main() {
    int n, q; cin >> n >> q;
    vector<ll> x(n), r(n), h(n); repeat (i,n) cin >> x[i] >> r[i] >> h[i];
    vector<double> v(n); repeat (i,n) v[i] = M_PI * pow(r[i],2) * h[i] / 3;
    auto v_from = [&](int i, ll l) {
        double nh = x[i] + h[i] - l;
        return v[i] * pow(nh / h[i], 3);
    };
    while (q --) {
        ll a, b; cin >> a >> b;
        double ans = 0;
        repeat (i,n) {
            if (a <= x[i] + h[i]) ans += v_from(i, max(a, x[i]));
            if (b <= x[i] + h[i]) ans -= v_from(i, max(b, x[i]));
        }
        cout << ans << endl;
    }
    return 0;
}