#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
typedef pair<int,int> pii;

int N;
int M;
int P,Q,R;

void decidePlace(int &sumX,vector<pii>&deck,int &xPos,int x){
    for(int j=0;j<deck.size();j++){
        if(sumX+deck[j].second-deck[j].first+1>=x){
            xPos=j;
            break;
        }
        sumX+=deck[j].second-deck[j].first+1;
    }
}
void divideBlock(vector<pii> &deck,int &xPos,int &sumX,int x,bool isX){
    int minu=1;
    if(isX)minu++;
    pii p1=pii(deck[xPos].first,deck[xPos].first+(x-sumX-minu));
    pii p2=pii(p1.second+1,deck[xPos].second);
    deck.erase(deck.begin()+xPos);
    if(p2.first<=p2.second)deck.insert(deck.begin()+xPos,p2);
    if(p1.first<=p1.second)deck.insert(deck.begin()+xPos,p1);
}

int main(){
    while(cin>>N&&N){
        int res=0;
        cin>>M>>P>>Q>>R;
        vector<pii> deck;
        deck.push_back(pii(1,N));
        int x,y;
        for(int i=0;i<M;i++){
            cin>>x>>y;
            x++;
            int sumX=0;
            int sumY=0;
            int xPos,yPos;
            decidePlace(sumX,deck,xPos,x);
            decidePlace(sumY,deck,yPos,y);
            if(xPos==yPos){
                pii p1=pii(deck[xPos].first,deck[xPos].first+(x-sumX-2));
                pii p2=pii(p1.second+1,deck[yPos].first+(y-sumY-1));
                pii p3=pii(p2.second+1,deck[xPos].second);
                deck.erase(deck.begin()+xPos);
                if(p3.first<=p3.second)deck.insert(deck.begin()+xPos,p3);
                if(p2.first<=p2.second)deck.insert(deck.begin()+xPos,p2);
                if(p1.first<=p1.second)deck.insert(deck.begin()+xPos,p1);
            }
            else{
                divideBlock(deck,yPos,sumY,y,false);
                divideBlock(deck,xPos,sumX,x,true);
            }
            sumX=sumY=0;
            decidePlace(sumX,deck,xPos,x);
            decidePlace(sumY,deck,yPos,y);
            vector<pii> cutPlace;
            vector<pii> prv;
            vector<pii> nxt;
            for(int i=xPos;i<=yPos;i++)cutPlace.push_back(deck[i]);
            for(int i=0;i<xPos;i++)prv.push_back(deck[i]);
            for(int i=yPos+1;i<deck.size();i++)nxt.push_back(deck[i]);
            deck.clear();
            for(int i=0;i<nxt.size();i++)deck.push_back(nxt[i]);
            for(int i=0;i<cutPlace.size();i++)deck.push_back(cutPlace[i]);
            for(int i=0;i<prv.size();i++)deck.push_back(prv[i]);
        }
        int sum=0;
        bool isApP=false;
        for(int i=0;i<deck.size();i++){
            int cnt=deck[i].second-deck[i].first+1;
            sum+=cnt;
            if(sum<P)continue;
            if(sum-cnt<P&&sum-cnt<Q&&sum>=P&&sum>=Q){
                int pPos=P-(sum-cnt)-1;
                int pNum=pPos+deck[i].first;
                int qPos=Q-(sum-cnt)-1;
                int qNum=qPos+deck[i].first;
                if(pNum<=R)res+=max(0,min(-qNum+R+1,qNum-pNum+1));
                break;
            }
            else if(!isApP&&sum>=P){
                isApP=true;
                int pPos=P-(sum-cnt)-1;
                int pNum=pPos+deck[i].first;
                if(pNum<=R)res+=max(0,min(-deck[i].first+R+1,deck[i].second-pNum+1));
            }
            else if(isApP){
                if(sum>=Q){
                    int qPos=Q-(sum-cnt)-1;
                    int qNum=qPos+deck[i].first;
                    if(deck[i].first<=R)res+=min(qNum-deck[i].first+1,(R-deck[i].first+1));
                    break;
                }
                else if(deck[i].first<=R)res+=max(0,min(-deck[i].first+R+1,deck[i].second-deck[i].first+1));
            }
        }
        cout<<res<<endl;
    }
    return 0;
}

Measured memory_bytes: 1120