记录编号 351093 评测结果 AAAAAAAAAA
题目名称 [HZOI 2016]采花 最终得分 100
用户昵称 Gravatarsxysxy 是否通过 通过
代码语言 C++ 运行时间 4.899 s
提交时间 2016-11-16 10:26:16 内存使用 129.99 MiB
显示代码纯文本
  1. //%%%%膜拜想出建两棵树的大神犇们
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <list>
  6. #include <queue>
  7. #include <vector>
  8. using namespace std;
  9. #define MAXN 200001
  10. struct node
  11. {
  12. int ls, rs;
  13. int cnt;
  14. }ns[MAXN*55+1];
  15. int last = 1;
  16. int build(int l, int r)
  17. {
  18. if(l > r)return 0;
  19. int c = last++;
  20. node &d = ns[c];
  21. if(l == r)return c;
  22. else
  23. {
  24. int m = (l+r)>>1;
  25. d.ls = build(l, m);
  26. d.rs = build(m+1, r);
  27. }
  28. return c;
  29. }
  30. int insert(int base, int l, int r, int v)
  31. {
  32. int c = last++;
  33. ns[c] = ns[base];
  34. if(l == r && l == v)
  35. {
  36. ns[c].cnt++;
  37. return c;
  38. }
  39. else
  40. {
  41. int m = (l+r)>>1;
  42. if(v <= m)ns[c].ls = insert(ns[base].ls, l, m, v);
  43. else ns[c].rs = insert(ns[base].rs, m+1, r, v);
  44. ns[c].cnt = ns[ns[c].ls].cnt + ns[ns[c].rs].cnt;
  45. }
  46. return c;
  47. }
  48. int query(int pre, int cur, int l, int r, int ql, int qr)
  49. {
  50. if(ql <= l && r <= qr)
  51. return ns[cur].cnt-ns[pre].cnt;
  52. int res = 0;
  53. int m = (l+r)>>1;
  54. if(ql <= m)res += query(ns[pre].ls, ns[cur].ls, l, m, ql, qr);
  55. if(m < qr)res += query(ns[pre].rs, ns[cur].rs, m+1, r, ql, qr);
  56. return res;
  57. }
  58. int root[MAXN*2+2];
  59. int col[MAXN];
  60. int prev1[MAXN];
  61. int prev2[MAXN];
  62. int main()
  63. {
  64. freopen("flower++.in", "r", stdin);
  65. freopen("flower++.out", "w", stdout);
  66. int n, c, q;
  67. scanf("%d %d %d", &n, &c, &q);
  68. for(int i = 1; i <= n; i++)
  69. scanf("%d", col+i);
  70. root[0] = build(1, n);
  71. root[n+1] = build(1, n);
  72. for(int i = 1; i <= n; i++)
  73. {
  74. int v = col[i];
  75. if(prev1[v])
  76. root[i] = insert(root[i-1], 1, n, prev1[v]);
  77. else root[i] = root[i-1];
  78. if(prev2[v])
  79. root[n+i+1] = insert(root[n+i], 1, n, prev2[v]);
  80. else root[n+i+1] = root[n+i];
  81. prev2[v] = prev1[v];
  82. prev1[v] = i;
  83. }
  84. int ans = 0;
  85. while(q--)
  86. {
  87. int l, r;
  88. scanf("%d %d", &l, &r);
  89. l ^= ans; r ^= ans;
  90. ans = query(root[l-1], root[r], 1, n, l, r);
  91. ans -= query(root[n+l], root[n+r+1], 1, n, l, r);
  92. printf("%d\n", ans);
  93. }
  94. return 0;
  95. }