#define real double
#include <math.h>

real abs(real x){ if(x>0) return x; else return -x;}
real max(real x,real y){ if(x>y) return x; else return y;}

real adapt(real (*func)(real),
	real a,real b,real fa,real fb,real eps,real acc,real *err){

real h=b-a; real xm=(a+b)/2; real fm=(*func)(xm);
real i1=fm*h; real i2=(fa+fb)/2*h; real i=2*i1/3+i2/3;
real tol=max(acc,eps*abs(i)); *err=abs(i1-i2)/2;

if(*err<tol)
	return i;
else	{
	real err1,err2;
	i1=adapt(func,a,xm,fa,fm,eps,acc/sqrt(2.),&err1);
	i2=adapt(func,xm,b,fm,fb,eps,acc/sqrt(2.),&err2);
	*err=sqrt(err1*err1+err2*err2);
	return i1+i2; }
}
