import graph;

real f(real x) {return x^3-x+2;}
pair F(real x) {return (x,f(x));}

void rectangle(real a, real b, real c, real h(real,real))
{
 real height=(a < c && c < b) ? f(c) : h(f(a),f(b));
 pair p=(a,0), q=(b,height);
 path g=box(p,q);
 fill(g,lightgray);
 draw(g);
}

void partition(real a, real b, real c, real h(real,real))
{
 rectangle(a,a+.4,c,h);
 rectangle(a+.4,a+.6,c,h);
 rectangle(a+.6,a+1.2,c,h);
 rectangle(a+1.2,a+1.6,c,h);
 rectangle(a+1.6,a+1.8,c,h);
 rectangle(a+1.8,b,c,h);

 draw((a,0)--(F(a)));
 draw((b,0)--(F(b)));

 draw(graph(f,a,b,operator ..),red);
 draw((a,0)--(b,0));
 labelx("$a$",a);
 labelx("$b$",b);
}