C (gcc), 176 bytes
#define p printf("%d ",
int*_,i;f(x,n)int**x;{if(n<5){for(_=x[2*n-2];_-x[2*n-1];++_)p*_);}else{n-=4;for(i=0;i<8;i+=2)if(n&&x[i]+1-x[i+1])for(_=x[i+1];_-x[i]&&n;--_,--n);p*_);}}
Takes the array as a list of 4 start/end pointer pairs, then n.
Description:
#define p printf("%d ", // This gives us the short-hand for printing
int*_, // This defines _ as a pointer to int
i; // This defines i as an integer
f(x,n)int**x;{ // This defines f as a function taking int **x and int n
// NOTE: x is {start, end, start, end, start, end, start, end}
if (n<5) { // This is for the 1-4 case
for(_=x[2*n-2]; // Loop _ from the 'end pointer'
_-x[2*n-1];++_) // Until the 'start pointer'
p*_); // Using the short-hand, print *_
}else{ // This is for the 5+ case
n-=4; // Cut n to improve indexing
for(i=0;i<8;i+=2) // Loop over each 'start pointer index'
for(_=x[i+1]; // Loop _ from the 'end pointer'
_-x[i]&&n; // Until the 'start pointer' or n becomes 0
--_,--n); // Decreasing n each time
p*_);}} // _ now points to the 'correct' index, so print it