struct NRf3 {
	Doub xsav,ysav;
	Doub (*func3d)(const Doub, const Doub, const Doub);
	Doub operator()(const Doub z)
	{
		return func3d(xsav,ysav,z);
	}
};
struct NRf2 {
	NRf3 f3;
	Doub (*z1)(Doub, Doub);
	Doub (*z2)(Doub, Doub);
	NRf2(Doub zz1(Doub, Doub), Doub zz2(Doub, Doub)) : z1(zz1), z2(zz2) {}
	Doub operator()(const Doub y)
	{
		f3.ysav=y;
		return qgaus(f3,z1(f3.xsav,y),z2(f3.xsav,y));
	}
};
struct NRf1 {
	Doub (*y1)(Doub);
	Doub (*y2)(Doub);
	NRf2 f2;
	NRf1(Doub yy1(Doub), Doub yy2(Doub), Doub z1(Doub, Doub),
		Doub z2(Doub, Doub)) : y1(yy1),y2(yy2), f2(z1,z2) {}
	Doub operator()(const Doub x)
	{
		f2.f3.xsav=x;
		return qgaus(f2,y1(x),y2(x));
	}
};

template <class T>
Doub quad3d(T &func, const Doub x1, const Doub x2, Doub y1(Doub), Doub y2(Doub),
	Doub z1(Doub, Doub), Doub z2(Doub, Doub))
{
	NRf1 f1(y1,y2,z1,z2);
	f1.f2.f3.func3d=func;
	return qgaus(f1,x1,x2);
}