f[a_] := Module[{b, startpos, endpos}, b = Differences[Subtract[1 , UnitStep[-Differences[a]]]]; (* for "nondescending" use this instead:*) (* b = Differences[UnitStep[Differences[a]]];*) startpos = Flatten[Position[b, 1]] + 1; endpos = Flatten[Position[b, -1]] + 1; If[startpos[[-1]] > endpos[[-1]], endpos = Join[endpos, {Length[a]}]]; If[startpos[[1]] > endpos[[1]], startpos = Join[{1}, startpos]]; Take[a, #] & /@ Transpose[{startpos, endpos}] ] Now, f[{1, -1, 2, 3, 4, 0, -2, 5, 0}] > {{-1, 2, 3, 4}, {-2, 5}} #Edit Here is the same function accelerated by `Nearest` (instead of `Position`) and a compiled routine to produce the sublists (instead of `Take`): f2[a_] := Module[{b, startpos, endpos}, b = Differences[Subtract[1, UnitStep[-Differences[a]]]]; (*b=Differences[UnitStep[Differences[a]]];*) {startpos, endpos} = Nearest[b -> Automatic, {1, -1}] + 1; If[startpos[[-1]] > endpos[[-1]], endpos = Join[endpos, {Length[a]}]]; If[startpos[[1]] > endpos[[1]], startpos = Join[{1}, startpos]]; Compile[{{a, _Integer, 1}, {startpos, _Integer}, {endpos, _Integer}}, a[[startpos ;; endpos]], RuntimeAttributes -> {Listable}, Parallelization -> True ][a, startpos, endpos] ] Test: a = RandomInteger[{-100, 100}, {1000000}]; r1 = f[a]; // RepeatedTiming // First r2 = f2[a]; // RepeatedTiming // First r1 == r2 > 1.0 > > 0.23 > > True