Problem p00459 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>

using namespace std;

#define rep(i, j) REP((i), 0, (j))
#define REP(i, j, k) for (int i = (j); (i) < (k); ++i)
#define BW(a, x, b) ((a) <= (x) && (x) <= (b))
#define ALL(v) (v).begin(), (v).end()
#define LENGTHOF(x) (sizeof(x) / sizeof(*(x)))
#define AFILL(a, b) fill((int *)a, (int *)(a + LENGTHOF(a)), b)
#define SQ(x) ((x) * (x))
#define Mod(x, mod) (((x)+(mod)%(mod))
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define INF 1 << 30
#define EPS 1e-10
#define MOD 1000000007

typedef pair<int, int> pi;
typedef pair<int, pi> pii;
typedef vector<int> vi;
typedef queue<int> qi;
typedef long long ll;

deque<pi> vec, a, b, c;
int N, M, P, Q, R;

int cnt(int p, int q, int r) {
  if (p > r)
    return 0;
  if (r >= q)
    return q - p + 1;
  return r - p + 1;
}

int countR(int p, int q, int r) {
  int n = 1, vp, res = 0;
  for (vp = 0; vp < vec.size(); vp++) {
    int f = vec[vp].F, l = vec[vp].S;
    int c = l - f + 1;
    if (n <= p) {
      if (n + c < p) {
      } else if (n + c > q) {
        res += cnt(f + p - n, f + q - n, r);
      } else {
        res += cnt(f + p - n, l, r);
      }
      n += c;
    } else if (n <= q) {
      if (n + c <= q) {
        res += cnt(f, l, r);
      } else {
        res += cnt(f, f + q - n, r);
      }
      n += c;
    }
  }
  return res;
}

int main() {
  while (1) {
    cin >> N;
    if (!N)
      break;
    cin >> M >> P >> Q >> R;
    vec.clear();
    vec.push_back(MP(1, N));
    int x, y;
    rep(i, M) {
      cin >> x >> y;
      a.clear();
      b.clear();
      int p = 1;
      while (p <= x) {
        int f = vec[0].F, s = vec[0].S;
        if (p + s - f <= x) {
          a.push_back(MP(f, s));
          p += s - f + 1;
          vec.pop_front();
        } else if (p + s - f > x) {
          a.push_back(MP(f, f + x - p));
          vec[0].F = f + x - p + 1;
          p = x + 1;
        }
      }
      while (p <= y) {
        int f = vec[0].F, s = vec[0].S;
        if (p + s - f <= y) {
          b.push_back(MP(f, s));
          p += s - f + 1;
          vec.pop_front();
        } else if (p + s - f > y) {
          b.push_back(MP(f, f + y - p));
          vec[0].F = f + y - p + 1;
          p = y + 1;
        }
      }

      vec.insert(vec.end(), b.begin(), b.end());
      vec.insert(vec.end(), a.begin(), a.end());
    }

    /*    rep(i, vec.size()){
      for(int j=vec[i].F;j<=vec[i].S;j++) cout << j << endl;;
      }*/
    cout << countR(P, Q, R) << endl;
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>

using namespace std;

#define rep(i, j) REP((i), 0, (j))
#define REP(i, j, k) for (int i = (j); (i) < (k); ++i)
#define BW(a, x, b) ((a) <= (x) && (x) <= (b))
#define ALL(v) (v).begin(), (v).end()
#define LENGTHOF(x) (sizeof(x) / sizeof(*(x)))
#define AFILL(a, b) fill((int *)a, (int *)(a + LENGTHOF(a)), b)
#define SQ(x) ((x) * (x))
#define Mod(x, mod) (((x)+(mod)%(mod))
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define INF 1 << 30
#define EPS 1e-10
#define MOD 1000000007

typedef pair<int, int> pi;
typedef pair<int, pi> pii;
typedef vector<int> vi;
typedef queue<int> qi;
typedef long long ll;

vector<pi> vec, a, b, c;
int N, M, P, Q, R;

int cnt(int p, int q, int r) {
  if (p > r)
    return 0;
  if (r >= q)
    return q - p + 1;
  return r - p + 1;
}

int countR(int p, int q, int r) {
  int n = 1, vp, res = 0;
  for (vp = 0; vp < vec.size(); vp++) {
    if (n <= p) {
      if (n + vec[vp].S - vec[vp].F + 1 < p) {
        n += vec[vp].S - vec[vp].F + 1;
        continue;
      }
      if (n + vec[vp].S - vec[vp].F + 1 > q) {
        res += cnt(vec[vp].F + p - n, vec[vp].F + q - n, r);
      } else {
        res += cnt(vec[vp].F + p - n, vec[vp].S, r);
      }
      n += vec[vp].S - vec[vp].F + 1;
    } else if (n <= q) {
      if (n + vec[vp].S - vec[vp].F + 1 < q) {
        res += cnt(vec[vp].F, vec[vp].F, r);
      } else {
        res += cnt(vec[vp].F, vec[vp].F + q - n, r);
      }
      n += vec[vp].S - vec[vp].F + 1;
    }
  }
  return res;
}

int main() {
  while (1) {
    cin >> N;
    if (!N)
      break;
    cin >> M >> P >> Q >> R;
    vec.clear();
    vec.PB(MP(1, N));
    int x, y;
    rep(i, M) {
      cin >> x >> y;
      a.clear();
      b.clear(); // c.clear();
      int p = 1;
      while (p <= x) {
        int f = vec[0].F, s = vec[0].S;
        if (p + s - f <= x) {
          a.PB(MP(f, s));
          p += s - f + 1;
          vec.erase(vec.begin());
        } else if (p + s - f > x) {
          a.PB(MP(f, f + x - p));
          vec[0].F = f + x - p + 1;
          p = x + 1;
        }
      }
      while (p <= y) {
        int f = vec[0].F, s = vec[0].S;
        if (p + s - f <= y) {
          b.PB(MP(f, s));
          p += s - f + 1;
          vec.erase(vec.begin());
        } else if (p + s - f > y) {
          b.PB(MP(f, f + y - p));
          vec[0].F = f + y - p + 1;
          p = y + 1;
        }
      }

      vec.insert(vec.end(), b.begin(), b.end());
      vec.insert(vec.end(), a.begin(), a.end());
      //      rep(i, vec.size()) cout << vec[i].F << " " <<vec[i].S << endl;
    }

    cout << countR(P, Q, R) << endl;
  }
  return 0;
}