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


#include <bits/stdc++.h>
#define lli long long int
#define vec2 vector<vector<lli>>
#define fio                                                                    \\
  ios_base::sync_with_stdio(false);                                            \\
  cin.tie(0);                                                                  \\
  cout.tie(0)
#define FRE                                                                    \\
  freopen("input.txt", "r", stdin);                                            \\
  freopen("ans.txt", "w", stdout)
#define mp make_pair
#define pll pair<lli, lli>
#define vll vector<lli>
#define pq2 priority_queue<pair<lli, lli>>
#define f first
#define s second
#define pb push_back
#define pf push_front
#define minii LLONG_MAX
#define all(x) x.begin(), x.end()
#define mem(a, b) memset(a, b, sizeof(a))
#define ld long double
const long double pi = 3.1415926535898;
#define dec greater<lli>()
const lli mod = 1000000007;
// const lli mod=100000000;
using namespace std;
lli lcm(lli a, lli b) { return ((a * b) / __gcd(a, b)); }
lli modpower(lli a, lli b) {
  if (b == 0)
    return 1;
  lli c = modpower(a, b / 2) % mod;
  if (b % 2)
    return (((a * c) % mod) * c) % mod;
  else
    return (c * c) % mod;
}
lli power(lli a, lli b) {
  if (b == 0)
    return 1;
  lli c = power(a, b / 2);
  if (b % 2)
    return (a * c * c);
  else
    return c * c;
}
bool prime(lli k) {
  if (k == 1 || k == 0)
    return 0;
  bool flag = 1;
  lli a = sqrt(k);
  for (int i = 2; i <= a; i++) {
    if (k % i == 0) {
      flag = 0;
      break;
    }
  }
  return flag;
}
lli sieve(int n) {
  bool qrr[n + 1];
  for (int i = 0; i <= n; i++)
    qrr[i] = 1;
  qrr[0] = 0;
  qrr[1] = 0;
  for (int i = 2; i <= n; i++) {
    if (qrr[i] == 1) {
      for (int j = i; j <= n; j += i) {
        qrr[j] = 0;
      }
    }
  }
  return 0;
}
lli a[500005], last[500005] = {-1}, fen[500005], n;
lli update(lli i, lli x) {
  while (i <= n) {
    fen[i] += x;
    i += i & (-i);
  }
  return 0;
}
lli soln(lli i) {
  lli sum = 0;
  while (i >= 1) {
    sum += fen[i];
    i -= i & (-i);
  }
  return sum;
}
int main() {
  lli q;
  cin >> n >> q;
  for (int i = 1; i <= n; i++)
    cin >> a[i];
  vector<pair<pll, lli>> qq;
  lli ans[q + 5];
  lli l, r;
  for (int i = 0; i < q; i++) {
    cin >> l >> r;
    qq.pb({{r, l}, i});
  }
  int j = 1;
  sort(all(qq));
  for (int i = 0; i < q; i++) {
    l = qq[i].f.s;
    r = qq[i].f.f;
    while (j <= r) {
      // cout<<last[a[j]]<<" "<<j<<"\\n";
      if (last[a[j]] == 0) {
        last[a[j]] = j;
        update(j, 1);
      } else {
        // cout<<last[a[j]]<<" "<<j<<"\\n";
        update(last[a[j]], -1);
        last[a[j]] = j;
        update(j, 1);
      }
      j++;
    }
    ans[qq[i].s] = soln(r) - soln(l - 1);
  }
  for (int i = 0; i < q; i++)
    cout << ans[i] << "\\n";
  return 0;
}

Error: TLE

Fixed submission:


#include <bits/stdc++.h>
#define lli int
#define vec2 vector<vector<lli>>
#define fio                                                                    \\
  ios_base::sync_with_stdio(false);                                            \\
  cin.tie(0);                                                                  \\
  cout.tie(0)
#define FRE                                                                    \\
  freopen("input.txt", "r", stdin);                                            \\
  freopen("ans.txt", "w", stdout)
#define mp make_pair
#define pll pair<lli, lli>
#define vll vector<lli>
#define pq2 priority_queue<pair<lli, lli>>
#define f first
#define s second
#define pb push_back
#define pf push_front
#define minii LLONG_MAX
#define all(x) x.begin(), x.end()
#define mem(a, b) memset(a, b, sizeof(a))
#define ld long double
const long double pi = 3.1415926535898;
#define dec greater<lli>()
const lli mod = 1000000007;
// const lli mod=100000000;
using namespace std;
lli lcm(lli a, lli b) { return ((a * b) / __gcd(a, b)); }
lli modpower(lli a, lli b) {
  if (b == 0)
    return 1;
  lli c = modpower(a, b / 2) % mod;
  if (b % 2)
    return (((a * c) % mod) * c) % mod;
  else
    return (c * c) % mod;
}
lli power(lli a, lli b) {
  if (b == 0)
    return 1;
  lli c = power(a, b / 2);
  if (b % 2)
    return (a * c * c);
  else
    return c * c;
}
bool prime(lli k) {
  if (k == 1 || k == 0)
    return 0;
  bool flag = 1;
  lli a = sqrt(k);
  for (int i = 2; i <= a; i++) {
    if (k % i == 0) {
      flag = 0;
      break;
    }
  }
  return flag;
}
lli sieve(int n) {
  bool qrr[n + 1];
  for (int i = 0; i <= n; i++)
    qrr[i] = 1;
  qrr[0] = 0;
  qrr[1] = 0;
  for (int i = 2; i <= n; i++) {
    if (qrr[i] == 1) {
      for (int j = i; j <= n; j += i) {
        qrr[j] = 0;
      }
    }
  }
  return 0;
}
set<lli> s[2000005];
lli a[500005];
lli make(lli l, lli r, lli k) {
  if (l == r) {
    s[k].insert(a[l]);
    return 0;
  }
  lli mid = (l + r) / 2;
  make(l, mid, 2 * k + 1);
  make(mid + 1, r, 2 * k + 2);
  for (auto it = s[2 * k + 1].begin(); it != s[2 * k + 1].end(); it++) {
    s[k].insert(*it);
  }
  for (auto it = s[2 * k + 2].begin(); it != s[2 * k + 2].end(); it++) {
    s[k].insert(*it);
  }
  return 0;
}
set<lli> ans(lli l, lli r, lli x, lli y, lli k) {
  set<lli> tt, t;
  if (y < l || x > r)
    return tt;
  if (x <= l && r <= y) {
    return s[k];
  }
  lli mid = (l + r) / 2;
  tt = ans(l, mid, x, y, 2 * k + 1);
  t = ans(mid + 1, r, x, y, 2 * k + 2);
  for (auto it = t.begin(); it != t.end(); it++)
    tt.insert(*it);
  return tt;
}
int main() {
  lli n, q, l, r;
  cin >> n >> q;
  for (int i = 0; i < n; i++)
    cin >> a[i];
  set<lli> tt;
  make(0, n - 1, 0);
  while (q--) {
    cin >> l >> r;
    l--;
    r--;
    tt = ans(0, n - 1, l, r, 0);
    cout << tt.size() << "\\n";
  }
  // cout<<n;
  return 0;
}