Problem p00459 (C++) — buggy submission, verdict: Runtime Error

#include <iostream>
using namespace std;

typedef struct tagListNode {
  struct tagListNode *next;
  int data; // 何個目までがr以下か
  int num;  // データ数
} Talon;

int main() {
  int n, m, p, q, r;
  int x, y;
  int i;
  Talon *firstnode, *lastnode, *thisnode, *newnode, *nextnode, *xnode, *ynode,
      *point, *pnode, *qnode;
  firstnode = lastnode = NULL;
  while (1) {
    cin >> n;
    if (n == 0)
      break;
    else {
      cin >> m >> p >> q >> r;
      newnode = new Talon;
      newnode->data = r;
      newnode->num = n;
      newnode->next = NULL;
      firstnode = lastnode = newnode;

      for (i = 0; i < m; i++) {
        cin >> x >> y;
        // xによる分割
        int numcount = 0;
        thisnode = firstnode;
        while (1) {
          if (numcount + thisnode->num >= x)
            break;
          else {
            numcount += thisnode->num;
            thisnode = thisnode->next;
          }
        }

        if (x - numcount == thisnode->num) {
          xnode = thisnode;
        } else if (x - numcount > thisnode->data) {
          newnode = new Talon;
          newnode->data = 0;
          newnode->num = thisnode->num - (x - numcount);
          newnode->next = thisnode->next;

          thisnode->num = x - numcount;
          xnode = thisnode;
          thisnode->next = newnode;
          if (thisnode == lastnode)
            lastnode = thisnode->next;
        } else {
          newnode = new Talon;
          newnode->data = thisnode->data - (x - numcount);
          newnode->num = thisnode->num - (x - numcount);
          newnode->next = thisnode->next;

          thisnode->data = x - numcount;
          thisnode->num = x - numcount;
          xnode = thisnode;
          thisnode->next = newnode;
          if (thisnode == lastnode)
            lastnode = thisnode->next;
        }
        // yにおける分割
        numcount = 0;
        thisnode = firstnode;
        while (1) {
          if (numcount + thisnode->num >= y)
            break;
          else {
            numcount += thisnode->num;
            thisnode = thisnode->next;
          }
        }
        if (y - numcount == thisnode->num) {
          ynode = thisnode;
        } else if (y - numcount > thisnode->data) {
          nextnode = thisnode->next;
          thisnode->next = new Talon;
          thisnode->next->data = 0;
          thisnode->next->num = thisnode->num - (y - numcount);
          thisnode->next->next = nextnode;

          ynode = thisnode;
          thisnode->num = y - numcount;
          if (thisnode == lastnode)
            lastnode = thisnode->next;
        } else {
          nextnode = thisnode->next;
          thisnode->next = new Talon;
          thisnode->next->data = thisnode->data - (y - numcount);
          thisnode->next->num = thisnode->num - (y - numcount);
          thisnode->next->next = nextnode;

          ynode = thisnode;
          thisnode->data = y - numcount;
          thisnode->num = y - numcount;
          if (thisnode == lastnode)
            lastnode = thisnode->next;
        }

        // shuffleする

        point = ynode->next;
        lastnode->next = xnode->next;
        ynode->next = firstnode;
        xnode->next = NULL;
        firstnode = point;
        lastnode = xnode;
      }

      // m以下の数の数を数える
      int numm = 0;
      int numcountp = 0;

      thisnode = firstnode;

      while (1) {
        if (numcountp + thisnode->num >= p)
          break;
        else {
          numcountp += thisnode->num;
          thisnode = thisnode->next;
        }
      }
      pnode = thisnode;

      int numcountq = numcountp;
      while (1) {
        if (numcountq + thisnode->num >= q)
          break;
        else {
          numcountq += thisnode->num;
          thisnode = thisnode->next;
        }
      }
      qnode = thisnode;

      thisnode = pnode;
      if (pnode != qnode) {
        if (numcountp + thisnode->data >= p) {
          numm += thisnode->data - (p - numcountp) + 1;
        }
        numcountp += thisnode->num;
        thisnode = thisnode->next;
        while (1) {
          if (thisnode == qnode)
            break;
          numm += thisnode->data;
          numcountp += thisnode->num;
          thisnode = thisnode->next;
        }

        if (q - numcountp > thisnode->data)
          numm += thisnode->data;
        else
          numm += q - numcountp;
      } else {
        if (p <= numcountp + pnode->data) {
          if (q <= numcountp + pnode->data) {
            numm = q - p + 1;
          } else {
            numm = thisnode->data - (p - numcountp);
          }
        }
      }

      cout << numm << endl;
    }
  }
  return 0;
}

Error: 0

Fixed submission:

#include <iostream>
using namespace std;

typedef struct tagListNode {
  struct tagListNode *next;
  int data;
} Talon;

int main() {
  int n, m, p, q, r;
  int x, y;
  int i;
  Talon *firstnode, *lastnode, *thisnode, *newnode, *xnode, *ynode, *point;
  firstnode = lastnode = NULL;
  while (1) {
    cin >> n;
    if (n == 0)
      break;
    for (i = 0; i < n; i++) {
      newnode = new Talon;
      newnode->data = i + 1;
      newnode->next = NULL;

      if (firstnode != NULL) {
        lastnode->next = newnode;
        lastnode = newnode;
      } else {
        firstnode = lastnode = newnode;
      }
    }
    cin >> m >> p >> q >> r;
    for (int j = 0; j < m; j++) {
      cin >> x >> y;
      xnode = firstnode;
      for (i = 0; i < x - 1; i++)
        xnode = xnode->next;

      ynode = firstnode;
      for (i = 0; i < y - 1; i++)
        ynode = ynode->next;

      point = ynode->next;
      lastnode->next = xnode->next;
      xnode->next = NULL;
      ynode->next = firstnode;
      firstnode = point;
      lastnode = xnode;
    }

    thisnode = firstnode;
    for (i = 0; i < p - 1; i++) {
      thisnode = thisnode->next;
    }

    int count = 0;
    for (i = 0; i < q - p + 1; i++) {
      int value = thisnode->data;
      if (value < r + 1)
        count++;
      thisnode = thisnode->next;
    }
    cout << count << endl;
  }
  return 0;
}