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

#include <algorithm>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <deque>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>

using namespace std;

#define REP(i, s, e) for (int i = int(s); i <= int(e); i++)
#define rep(i, n) for (int i = 0; i < int(n); i++)

vector<int> u1, v1, u2, v2;
void f(int x, int y, vector<int> &u1, vector<int> &v1, vector<int> &u2,
       vector<int> &v2) {
  int c = 0;
  int a, b, c1, c2;
  rep(i, u1.size()) {
    c += v1[i] - u1[i] + 1;
    if (c >= x) {
      a = i;
      c1 = c;
      break;
    }
  }
  c = 0;
  rep(i, u1.size()) {
    c += v1[i] - u1[i] + 1;
    if (c >= y) {
      b = i;
      c2 = c;
      break;
    }
  }

  if (c2 != y) {
    u2.push_back(v1[b] - (c2 - y) + 1);
    v2.push_back(v1[b]);

    REP(i, b + 1, u1.size() - 1) {
      u2.push_back(u1[i]);
      v2.push_back(v1[i]);
    }
  } else {
    REP(i, b + 1, u1.size() - 1) {
      u2.push_back(u1[i]);
      v2.push_back(v1[i]);
    }
  }

  if (a != b) {

    if (c1 != x) {
      u2.push_back(v1[a] - (c1 - x) + 1);
      v2.push_back(v1[a]);

      REP(i, a + 1, b - 1) {
        u2.push_back(u1[i]);
        v2.push_back(v1[i]);
      }
      u2.push_back(u1[b]);
      v2.push_back(v1[b] - (c2 - y));
    } else {
      REP(i, a + 1, b - 1) {
        u2.push_back(u1[i]);
        v2.push_back(v1[i]);
      }
      u2.push_back(u1[b]);
      v2.push_back(v1[b] - (c2 - y));
    }
  }

  else {

    u2.push_back(v1[a] - (c1 - x) + 1);
    v2.push_back(v1[b] - (c2 - y));
  }

  REP(i, 0, a - 1) {
    u2.push_back(u1[i]);
    v2.push_back(v1[i]);
  }
  u2.push_back(u1[a]);
  v2.push_back(v1[a] - (c1 - x));
}

int main() {

  int m, n, p, q, r, x, y;

  while (1) {

    cin >> n;
    if (n == 0)
      break;
    cin >> m >> p >> q >> r;

    REP(i, 1, m) {

      cin >> x >> y;

      if (i == 1) {
        u1.push_back(y + 1);
        v1.push_back(n);
        u1.push_back(x + 1);
        v1.push_back(y);
        u1.push_back(1);
        v1.push_back(x);
      } else if (i % 2 == 0) {
        u2.clear();
        v2.clear();
        f(x, y, u1, v1, u2, v2);
      } else if (i % 2 == 1) {
        u1.clear();
        v1.clear();
        f(x, y, u2, v2, u1, v1);
      }
    }

    int s = 0;
    int c = 0;
    int a, b, c1, c2;
    if (m % 2 == 0) {

      rep(i, u2.size()) {
        c += v2[i] - u2[i] + 1;
        if (c >= p) {
          a = i;
          c1 = c;
          break;
        }
      }
      c = 0;
      rep(i, u2.size()) {
        c += v2[i] - u2[i] + 1;
        if (c >= q) {
          b = i;
          c2 = c;
          break;
        }
      }

      if (a != b) {

        REP(i, v2[a] - (c1 - p), v2[a])
        if (i <= r)
          s++;
        REP(i, a + 1, b - 1) {
          REP(j, u2[i], v2[i]) {
            if (j <= r)
              s++;
          }
        }
        REP(i, u2[b], v2[b] - (c2 - q))
        if (i <= r)
          s++;

      }

      else {

        REP(i, v2[a] - (c1 - p), v2[a] - (c2 - q))
        if (i <= r)
          s++;
      }

      cout << s << endl;

    }

    else {

      rep(i, u1.size()) {
        c += v1[i] - u1[i] + 1;
        if (c >= p) {
          a = i;
          c1 = c;
          break;
        }
      }
      c = 0;
      rep(i, u1.size()) {
        c += v1[i] - u1[i] + 1;
        if (c >= q) {
          b = i;
          c2 = c;
          break;
        }
      }

      if (a != b) {

        REP(i, v1[a] - (c1 - p), v1[a])
        if (i <= r)
          s++;
        REP(i, a + 1, b - 1) {
          REP(j, u1[i], v1[i]) {
            if (j <= r)
              s++;
          }
        }
        REP(i, u1[b], v1[b] - (c2 - q))
        if (i <= r)
          s++;

      }

      else {

        REP(i, v1[a] - (c1 - p), v1[a] - (c2 - q))
        if (i <= r)
          s++;
      }

      cout << s << endl;
    }

    u1.clear();
    v1.clear();
    u2.clear();
    v2.clear();
  }

  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <deque>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>

using namespace std;

#define REP(i, s, e) for (int i = int(s); i <= int(e); i++)
#define rep(i, n) for (int i = 0; i < int(n); i++)

vector<int> u1, v1, u2, v2;
void f(int x, int y, vector<int> &u1, vector<int> &v1, vector<int> &u2,
       vector<int> &v2) {
  int c = 0;
  int a, b, c1, c2;
  rep(i, u1.size()) {
    c += v1[i] - u1[i] + 1;
    if (c >= x) {
      a = i;
      c1 = c;
      break;
    }
  }
  c = 0;
  rep(i, u1.size()) {
    c += v1[i] - u1[i] + 1;
    if (c >= y) {
      b = i;
      c2 = c;
      break;
    }
  }

  if (c2 != y) {
    u2.push_back(v1[b] - (c2 - y) + 1);
    v2.push_back(v1[b]);

    REP(i, b + 1, u1.size() - 1) {
      u2.push_back(u1[i]);
      v2.push_back(v1[i]);
    }
  } else {
    REP(i, b + 1, u1.size() - 1) {
      u2.push_back(u1[i]);
      v2.push_back(v1[i]);
    }
  }

  if (a != b) {

    if (c1 != x) {
      u2.push_back(v1[a] - (c1 - x) + 1);
      v2.push_back(v1[a]);

      REP(i, a + 1, b - 1) {
        u2.push_back(u1[i]);
        v2.push_back(v1[i]);
      }
      u2.push_back(u1[b]);
      v2.push_back(v1[b] - (c2 - y));
    } else {
      REP(i, a + 1, b - 1) {
        u2.push_back(u1[i]);
        v2.push_back(v1[i]);
      }
      u2.push_back(u1[b]);
      v2.push_back(v1[b] - (c2 - y));
    }
  }

  else {

    u2.push_back(v1[a] - (c1 - x) + 1);
    u2.push_back(v1[b] - (c2 - y));
  }

  REP(i, 0, a - 1) {
    u2.push_back(u1[i]);
    v2.push_back(v1[i]);
  }
  u2.push_back(u1[a]);
  v2.push_back(v1[a] - (c1 - x));
}

int main() {

  int m, n, p, q, r, x, y;

  while (1) {

    cin >> n;
    if (n == 0)
      break;
    cin >> m >> p >> q >> r;

    REP(i, 1, m) {

      cin >> x >> y;

      if (i == 1) {
        u1.push_back(y + 1);
        v1.push_back(n);
        u1.push_back(x + 1);
        v1.push_back(y);
        u1.push_back(1);
        v1.push_back(x);
      } else if (i % 2 == 0) {
        u2.clear();
        v2.clear();
        f(x, y, u1, v1, u2, v2);
      } else if (i % 2 == 1) {
        u1.clear();
        v1.clear();
        f(x, y, u2, v2, u1, v1);
      }
    }

    int s = 0;
    int c = 0;
    int a, b, c1, c2;
    if (m % 2 == 0) {

      rep(i, u2.size()) {
        c += v2[i] - u2[i] + 1;
        if (c >= p) {
          a = i;
          c1 = c;
          break;
        }
      }
      c = 0;
      rep(i, u2.size()) {
        c += v2[i] - u2[i] + 1;
        if (c >= q) {
          b = i;
          c2 = c;
          break;
        }
      }

      if (a != b) {

        REP(i, v2[a] - (c1 - p), v2[a])
        if (i <= r)
          s++;
        REP(i, a + 1, b - 1) {
          REP(j, u2[i], v2[i]) {
            if (j <= r)
              s++;
          }
        }
        REP(i, u2[b], v2[b] - (c2 - q))
        if (i <= r)
          s++;

      }

      else {

        REP(i, v2[a] - (c1 - p), v2[a] - (c2 - q))
        if (i <= r)
          s++;
      }

      cout << s << endl;

    }

    else {

      rep(i, u1.size()) {
        c += v1[i] - u1[i] + 1;
        if (c >= p) {
          a = i;
          c1 = c;
          break;
        }
      }
      c = 0;
      rep(i, u1.size()) {
        c += v1[i] - u1[i] + 1;
        if (c >= q) {
          b = i;
          c2 = c;
          break;
        }
      }

      if (a != b) {

        REP(i, v1[a] - (c1 - p), v1[a])
        if (i <= r)
          s++;
        REP(i, a + 1, b - 1) {
          REP(j, u1[i], v1[i]) {
            if (j <= r)
              s++;
          }
        }
        REP(i, u1[b], v1[b] - (c2 - q))
        if (i <= r)
          s++;

      }

      else {

        REP(i, v1[a] - (c1 - p), v1[a] - (c2 - q))
        if (i <= r)
          s++;
      }

      cout << s << endl;
    }

    u1.clear();
    v1.clear();
    u2.clear();
    v2.clear();
  }

  return 0;
}