fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. typedef pair<int, int> ii;
  6.  
  7. const int INF = 1e9;
  8. const ll LINF = 1e18;
  9. const int N = 3e4 + 5;
  10. const int Q = 2e5 + 5;
  11. const int MAX_A = 1e6 + 5;
  12.  
  13. struct query {
  14. int l, i;
  15. };
  16.  
  17. int n, q;
  18. int a[N];
  19. vector<query> queries[N]; // queries[R]: danh sách những truy vấn có đầu mút r == R
  20. int last[MAX_A]; // last[x] = i gần nhất sao cho a[i] == x
  21. int pre[N]; // pre[i] = j gần nhất sao cho a[j] == a[i]
  22. int ans[Q];
  23.  
  24. int ft[N];
  25.  
  26. void update(int i, int val) {
  27. for (; i <= n; i += i & (-i)) ft[i] += val;
  28. }
  29.  
  30. int getSum(int i) {
  31. int ans = 0;
  32. for (; i > 0; i -= i & (-i)) ans += ft[i];
  33. return ans;
  34. }
  35.  
  36. int main() {
  37. ios::sync_with_stdio(0); cin.tie(0);
  38. cin >> n;
  39. for (int i = 1; i <= n; i++) cin >> a[i];
  40.  
  41. cin >> q;
  42. for (int i = 1; i <= q; i++) {
  43. int l, r;
  44. cin >> l >> r;
  45. queries[r].push_back({l, i});
  46. }
  47.  
  48. for (int i = 1; i <= n; i++) {
  49. pre[i] = last[a[i]];
  50. last[a[i]] = i;
  51. }
  52.  
  53. for (int r = 1; r <= n; r++) {
  54. // xoá chỉ số ở đằng trước mà đại diện cho a[r]
  55. if (pre[r] > 0) update(pre[r], -1);
  56. // cho r làm chỉ số đại diện cho a[r]
  57. update(r, 1);
  58. // trả lời truy vấn
  59. for (auto& q : queries[r]) {
  60. ans[q.i] = getSum(r) - getSum(q.l - 1);
  61. }
  62. }
  63.  
  64. for (int i = 1; i <= q; i++) cout << ans[i] << '\n';
  65. }
  66.  
Success #stdin #stdout 0.01s 5704KB
stdin
5
1 1 2 1 3
3
1 5
2 4
3 5
stdout
3
2
3