#include <iostream>
#include <math.h>
#include <iomanip>
#define MAX 10+1
enum limit {lewy, prawy};
using namespace std;
int n; //liczba zestawów danych wielomianu
struct WIELOMIAN {
int m; //stopnie wielomianu
double w[MAX] = {0}; //współczynniki danego wielomianu
double w1[MAX] = {0}; //współczynniki danego wielomianu
int k; //Całkowita dodatnia liczba k określająca liczbę przedziałów całkowania
double p[MAX][2]; //k par liczb rzeczywistych definiujących granice całkowania
};
WIELOMIAN W[MAX];
double f(int i/*nr wielomianu*/, WIELOMIAN * W, double x)
{
double wynik = W[i].w1[0];
for(int j=1;j<=W[i].m;j++)
wynik = wynik*x + W[i].w1[j];
return wynik;
}
double f(int i /*nr wielomianu*/, double x /*argument*/) { //funkcja zwracająca wartość wielomianu
double result=W[i].w[0];
for(int z=1; z<=W[i].m;z++) {
result = result + W[i].w[z]*pow(x,z);
}
return result;
}
double Field(WIELOMIAN * W/*przedzial*/,int t/*nr zestawu danych*/,int r/*nr przedziału całkowania*/)
{
int q = 1000000; //liczba przedziałów w których liczone są trapezy
double a = W[t].p[r][lewy];
double b = W[t].p[r][prawy];
double h = (b-a)/(double)q; //wysokosć trapezów
double S = 0.0; //zmienna będzie przechowywać sumę pól trapezów
double podstawa_a = f(t,a);
double podstawa_b = f(t,b);
for(int i=1;i<=q;i++)
{
podstawa_b = f(t,a+h*i);
S += (podstawa_a+podstawa_b);
podstawa_a = podstawa_b;
}
return 0.5*S*h;
}
int main()
{
//========= Wczytywanie danych ==============================
cin >> n; //Liczba zestawów danych?
for (int i = 0; i < n; i++) { //i - nr wielomianu
cin >> W[i].m; //stopień wielomianu i
for(int j=0;j<=W[i].m;j++) {
cin>>W[i].w[j]; //współczynnik j wielomianu i
}
for(int j=0;j<=n;j++) {
W[i].w1[n-j] = W[i].w[j];
}
cin>>W[i].k; //ilość przedzialow calkowania
for(int r=0;r<W[i].k;r++) {
cin>>W[i].p[r][lewy];
cin>>W[i].p[r][prawy];
}
}
//========= Wypisywanie danych ==============================
for(int i=0;i<n;i++) {
for(int j=0;j<W[i].k;j++){
cout<<fixed<<setprecision(15)<<Field(W,i,j)<<endl;
}
}
return 0;
}