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

#include <bits/stdc++.h>
#define PART 1000
using namespace std;
pair<pair<int, int>, int> Q[500500];
inline bool Comp(pair<pair<int, int>, int> A, pair<pair<int, int>, int> B) {
  if (A.first.first / PART == B.first.first / PART) {
    if (A.first.second < B.first.second)
      return true;
    return false;
  }
  if (A.first.first / PART < B.first.first / PART)
    return true;
  return false;
}
int X[500500], L, R, Sum;
int Ans[500500];
int Have[500500];
inline void read(int &x) {
  while (true) {
    char c = getchar();
    if (c == ' ' || c == '\\n')
      break;
    //	cout<<"get"<<c<<endl;
    c -= '0';
    x = x * 10 + c;
    //	puts("Reading...");
  }
}
int main() {
  int N = 0, T = 0;
  read(N);
  read(T);
  //	cout<<N<<" "<<T<<endl;
  for (int i = 0; i < N; i++)
    read(X[i]);
  for (int i = 0; i < T; i++) {
    int l = 0, r = 0;
    read(l);
    read(r);
    l--;
    r--;
    Q[i] = {{l, r}, i};
  }
  sort(Q, Q + T, Comp);
  //	for(int i=0;i<T;i++)
  //		cout<<Q[i].second<<" ";
  //	puts("");
  for (int i = Q[0].first.first; i <= Q[0].first.second; i++) {
    if (!Have[X[i]])
      Sum++;
    Have[X[i]]++;
  }
  L = Q[0].first.first;
  R = Q[0].first.second; // 5e5*7e2=35e7
  Ans[Q[0].second] = Sum;
  for (int i = 1; i < T; i++) {
    while (L < Q[i].first.first) {
      Have[X[L]]--;
      if (!Have[X[L]]) {
        Sum--;
        //			puts("Minus!");
      }
      L++;
    }
    while (L > Q[i].first.first) {
      L--;
      if (!Have[X[L]]) {
        Sum++;
        // puts("Add");
      }
      Have[X[L]]++;
    }
    while (R < Q[i].first.second) {
      //	cout<<R<<" "<<Q[i].first.second<<endl;
      R++;
      if (!Have[X[R]]) {
        Sum++;
        //			puts("Add");
      }
      Have[X[R]]++;
    }
    while (R > Q[i].first.second) {
      Have[X[R]]--;
      if (!Have[X[R]])
        Sum--;
      R--;
    }
    //	cout<<Q[i].second<<" "<<Sum<<endl;
    Ans[Q[i].second] = Sum;
  }
  for (int i = 0; i < T; i++) {
    printf("%d\\n", Ans[i]);
  }
  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define PART 1000
using namespace std;
pair<pair<int, int>, int> Q[500500];
inline const bool operator<(pair<pair<int, int>, int> A,
                            pair<pair<int, int>, int> B) {
  if (A.first.first / PART == B.first.first / PART) {
    if (A.first.second < B.first.second)
      return true;
    return false;
  }
  if (A.first.first / PART < B.first.first / PART)
    return true;
  return false;
}
int X[500500], L, R, Sum;
int Ans[500500];
int Have[500500];
inline void read(int &x) {
  while (true) {
    char c = getchar();
    if (c == ' ' || c == '\\n')
      break;
    //	cout<<"get"<<c<<endl;
    c -= '0';
    x = x * 10 + c;
    //	puts("Reading...");
  }
}
int main() {
  int N = 0, T = 0;
  read(N);
  read(T);
  //	cout<<N<<" "<<T<<endl;
  for (int i = 0; i < N; i++)
    read(X[i]);
  for (int i = 0; i < T; i++) {
    int l = 0, r = 0;
    read(l);
    read(r);
    l--;
    r--;
    Q[i] = {{l, r}, i};
  }
  sort(Q, Q + T);
  //	for(int i=0;i<T;i++)
  //		cout<<Q[i].second<<" ";
  //	puts("");
  for (int i = Q[0].first.first; i <= Q[0].first.second; i++) {
    if (!Have[X[i]])
      Sum++;
    Have[X[i]]++;
  }
  L = Q[0].first.first;
  R = Q[0].first.second; // 5e5*7e2=35e7
  Ans[Q[0].second] = Sum;
  for (int i = 1; i < T; i++) {
    while (L < Q[i].first.first) {
      Have[X[L]]--;
      if (!Have[X[L]]) {
        Sum--;
        //			puts("Minus!");
      }
      L++;
    }
    while (L > Q[i].first.first) {
      L--;
      if (!Have[X[L]]) {
        Sum++;
        // puts("Add");
      }
      Have[X[L]]++;
    }
    while (R < Q[i].first.second) {
      //	cout<<R<<" "<<Q[i].first.second<<endl;
      R++;
      if (!Have[X[R]]) {
        Sum++;
        //			puts("Add");
      }
      Have[X[R]]++;
    }
    while (R > Q[i].first.second) {
      Have[X[R]]--;
      if (!Have[X[R]])
        Sum--;
      R--;
    }
    //	cout<<Q[i].second<<" "<<Sum<<endl;
    Ans[Q[i].second] = Sum;
  }
  for (int i = 0; i < T; i++)
    cout << Ans[i] << endl;
  return 0;
}