List Manipulation – Find the highest values ​​between two different sentences

I have the following two lists:

a1 = {0, 2, 4, 7, 8, 10};
b1 = {1, 4, 15, 8, 6, 2};
c1 = Thread@{a1, b1};
a2 = {0, 1, 4, 6, 8, 10};
b2 = {1, 6, 12, 10, 4, 2};
c2 = Thread@{a2, b2};

gives the following picture ListPlot[{c1, c2}, Joined -> True, Mesh -> All]:

Two lists

I want to find the wrapped points of the two lists, so I tried:

a3 = Join[a1, a2] // DeleteDuplicates // Sort;
f[l_List] := Interpolation[l, InterpolationOrder -> 1, Method -> "Spline"]
b11 = f[c1][#] & /@ a3;
b22 = f[c2][#] & /@ a3;
env = Table[Max[#[[i]] & /@ {b22, b11}], {i, 1, Length@a3}];
ListPlot[{c1, c2, Thread@{a3, env}}, Joined -> True, Mesh -> All]

env

But it's not as good as I had hoped.

I'm a bit rusty, so I know you all know a better and right way to do this :]