Problem p03685 (C++)

Buggy submission (status: Memory Limit Exceeded):
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() {
  int r, c, n;
  cin >> r >> c >> n;
  vector<int> x1(n), y1(n), x2(n), y2(n);
  vector<int> l(n, 0);
  //	vector<vector<int>> v(r+2,vector<int>(c+2,0));
  for (int i = 0; i < n; i++) {
    int flag, f1, f2, fx, fy;
    cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];
    f1 = f2 = fx = fy = flag = 0;
    if ((x1[i] == r) + (x1[i] == 0))
      fx = 1;
    if ((y1[i] == c) + (y1[i] == 0))
      fy = 1;
    if (fx + fy)
      f1 = 1;
    fx = fy = 0;
    if ((x2[i] == r) + (x2[i] == 0))
      fx = 1;
    if ((y2[i] == c) + (y2[i] == 0))
      fy = 1;
    if (fx + fy)
      f2 = 1;
    if (f1 * f2)
      flag = 1;
    l[i] = flag;
  }
  vector<int> d1(n), d2(n), s(2 * r + 2 * c + 1, 0);
  for (int i = 0; i < n; i++) {
    if (l[i]) {
      if (x1[i] == 0) {
        d1[i] = r + c + r + c - y1[i];
      } else if (x1[i] == r) {
        d1[i] = r + y1[i];
      } else {
        if (y1[i] == 0) {
          d1[i] = x1[i];
        } else {
          d1[i] = r + c + r - x1[i];
        }
      }
      if (d1[i] == 2 * r + 2 * c)
        d1[i] = 0;
      if (x2[i] == 0) {
        d2[i] = r + c + r + c - y2[i];
      } else if (x2[i] == r) {
        d2[i] = r + y2[i];
      } else {
        if (y2[i] == 0) {
          d2[i] = x2[i];
        } else {
          d2[i] = r + c + r - x2[i];
        }
      }
      if (d2[i] == 2 * r + 2 * c)
        d2[i] = 0;
    }
  }
  vector<pair<int, int>> pv;
  for (int i = 0; i < n; i++) {
    if (l[i]) {
      pair<int, int> p;
      p.first = d1[i];
      p.second = i;
      pv.push_back(p);
      p.first = d2[i];
      pv.push_back(p);
    }
  }
  sort(pv.begin(), pv.end());
  vector<int> a;
  while (pv.size()) {
    int temp = pv.back().second;
    pv.erase(pv.end() - 1);
    if (a.size()) {
      if (a.back() == temp) {
        a.erase(a.end() - 1);
      } else {
        a.push_back(temp);
      }
    } else {
      a.push_back(temp);
    }
  }

  //	for(int i=0;i<n;i++){
  //		if(l[i]){
  //			long long temp1,temp2;
  //			temp1=d1[i];
  //			temp2=d2[i];
  //			if(temp1>temp2){
  //				temp1=d2[i];
  //				temp2=d1[i];
  //			}
  //			s[temp1]++;
  //			s[temp2+1]--;
  ////			cout<<temp1<<' '<<temp2<<endl;
  //		}
  //	}
  //	for(long long i=1;i<2*r+2*c;i++){
  //		s[i]+=s[i-1];
  ////		cout<<s[i];
  //	}
  //	int flag=1;
  //	for(int i=0;i<n;i++){
  //		if(l[i]){
  //			if(s[d1[i]]!=s[d2[i]]){
  //				flag=0;
  //			}
  //		}
  //	}

  //	for(int i=0;i<n;i++){
  //		if(l[i]){
  //			long long tx1,tx2,ty1,ty2;
  //			tx1=x1[i];
  //			tx2=x2[i];
  //			ty1=y1[i];
  //			ty2=y2[i];
  //			if((x1[i]-x2[i])*(y1[i]-y2[i])>1){
  //				tx1=x2[i];
  //				tx2=x1[i];
  //			}
  //			if(y1[i]>y2[i]){
  //				long long temp;
  //				temp=ty1;
  //				ty1=ty2;
  //				ty2=temp;
  //				temp=tx1;
  //				tx1=tx2;
  //				tx2=temp;
  //			}
  ////			v[tx1][ty1]++;
  ////			v[tx1][ty2+1]--;
  ////			v[tx2+1][ty1]--;
  ////			v[tx2+1][ty2+1]++;
  //			v[tx1][ty1]++;
  //			v[tx1][ty2]--;
  //			v[tx2][ty1]--;
  //			v[tx2][ty2]++;
  //		}
  //	}
  //	for(int i=0;i<=r+1;i++){
  //		for(int j=1;j<=c+1;j++){
  //			v[i][j]+=v[i][j-1];
  //		}
  //	}
  //	for(int i=1;i<=r+1;i++){
  //		for(int j=0;j<=c+1;j++){
  //			v[i][j]+=v[i-1][j];
  //		}
  //	}
  //	int flag=1;
  //	for(int i=0;i<n;i++){
  //		if(l[i]){
  //			if(v[x1[i]][y1[i]]!=v[x2[i]][y2[i]]){
  //				flag=0;
  //			}
  //		}
  //	}

  if (a.size() == 0) {
    cout << "YES" << endl;
  } else {
    cout << "NO" << endl;
  }

  return 0;
}


Fixed submission:
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() {
  int r, c, n;
  cin >> r >> c >> n;
  vector<int> x1(n), y1(n), x2(n), y2(n);
  vector<int> l(n, 0);
  //	vector<vector<int>> v(r+2,vector<int>(c+2,0));
  for (int i = 0; i < n; i++) {
    int flag, f1, f2, fx, fy;
    cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];
    f1 = f2 = fx = fy = flag = 0;
    if ((x1[i] == r) + (x1[i] == 0))
      fx = 1;
    if ((y1[i] == c) + (y1[i] == 0))
      fy = 1;
    if (fx + fy)
      f1 = 1;
    fx = fy = 0;
    if ((x2[i] == r) + (x2[i] == 0))
      fx = 1;
    if ((y2[i] == c) + (y2[i] == 0))
      fy = 1;
    if (fx + fy)
      f2 = 1;
    if (f1 * f2)
      flag = 1;
    l[i] = flag;
  }
  vector<int> d1(n), d2(n);
  for (int i = 0; i < n; i++) {
    if (l[i]) {
      if (x1[i] == 0) {
        d1[i] = r + c + r + c - y1[i];
      } else if (x1[i] == r) {
        d1[i] = r + y1[i];
      } else {
        if (y1[i] == 0) {
          d1[i] = x1[i];
        } else {
          d1[i] = r + c + r - x1[i];
        }
      }
      if (d1[i] == 2 * r + 2 * c)
        d1[i] = 0;
      if (x2[i] == 0) {
        d2[i] = r + c + r + c - y2[i];
      } else if (x2[i] == r) {
        d2[i] = r + y2[i];
      } else {
        if (y2[i] == 0) {
          d2[i] = x2[i];
        } else {
          d2[i] = r + c + r - x2[i];
        }
      }
      if (d2[i] == 2 * r + 2 * c)
        d2[i] = 0;
    }
  }
  vector<pair<int, int>> pv;
  for (int i = 0; i < n; i++) {
    if (l[i]) {
      pair<int, int> p;
      p.first = d1[i];
      p.second = i;
      pv.push_back(p);
      p.first = d2[i];
      pv.push_back(p);
    }
  }
  sort(pv.begin(), pv.end());
  vector<int> a;
  while (pv.size()) {
    int temp = pv.back().second;
    pv.erase(pv.end() - 1);
    if (a.size()) {
      if (a.back() == temp) {
        a.erase(a.end() - 1);
      } else {
        a.push_back(temp);
      }
    } else {
      a.push_back(temp);
    }
  }

  //	for(int i=0;i<n;i++){
  //		if(l[i]){
  //			long long temp1,temp2;
  //			temp1=d1[i];
  //			temp2=d2[i];
  //			if(temp1>temp2){
  //				temp1=d2[i];
  //				temp2=d1[i];
  //			}
  //			s[temp1]++;
  //			s[temp2+1]--;
  ////			cout<<temp1<<' '<<temp2<<endl;
  //		}
  //	}
  //	for(long long i=1;i<2*r+2*c;i++){
  //		s[i]+=s[i-1];
  ////		cout<<s[i];
  //	}
  //	int flag=1;
  //	for(int i=0;i<n;i++){
  //		if(l[i]){
  //			if(s[d1[i]]!=s[d2[i]]){
  //				flag=0;
  //			}
  //		}
  //	}

  //	for(int i=0;i<n;i++){
  //		if(l[i]){
  //			long long tx1,tx2,ty1,ty2;
  //			tx1=x1[i];
  //			tx2=x2[i];
  //			ty1=y1[i];
  //			ty2=y2[i];
  //			if((x1[i]-x2[i])*(y1[i]-y2[i])>1){
  //				tx1=x2[i];
  //				tx2=x1[i];
  //			}
  //			if(y1[i]>y2[i]){
  //				long long temp;
  //				temp=ty1;
  //				ty1=ty2;
  //				ty2=temp;
  //				temp=tx1;
  //				tx1=tx2;
  //				tx2=temp;
  //			}
  ////			v[tx1][ty1]++;
  ////			v[tx1][ty2+1]--;
  ////			v[tx2+1][ty1]--;
  ////			v[tx2+1][ty2+1]++;
  //			v[tx1][ty1]++;
  //			v[tx1][ty2]--;
  //			v[tx2][ty1]--;
  //			v[tx2][ty2]++;
  //		}
  //	}
  //	for(int i=0;i<=r+1;i++){
  //		for(int j=1;j<=c+1;j++){
  //			v[i][j]+=v[i][j-1];
  //		}
  //	}
  //	for(int i=1;i<=r+1;i++){
  //		for(int j=0;j<=c+1;j++){
  //			v[i][j]+=v[i-1][j];
  //		}
  //	}
  //	int flag=1;
  //	for(int i=0;i<n;i++){
  //		if(l[i]){
  //			if(v[x1[i]][y1[i]]!=v[x2[i]][y2[i]]){
  //				flag=0;
  //			}
  //		}
  //	}

  if (a.size() == 0) {
    cout << "YES" << endl;
  } else {
    cout << "NO" << endl;
  }

  return 0;
}