fork download
  1. /* Author haleyk10198 */
  2. /* 作者: haleyk10198 */
  3. /* CF handle: haleyk100198*/
  4. #include <bits/stdc++.h>
  5.  
  6. #define MOD 1000000007
  7. #define LINF (1LL<<60)
  8. #define INF 2147483647
  9. #define PI 3.1415926535897932384626433
  10. #define ll long long
  11. #define pii pair<int,int>
  12. #define mp(x,y) make_pair((x),(y))
  13. #define pb(x) push_back((x))
  14. #define vi vector<int>
  15. #define vvi vector<vi>
  16. #define SQN 317
  17.  
  18. using namespace std;
  19.  
  20. string itos(int x){
  21. stringstream ss;
  22. ss << x;
  23. return ss.str();
  24. }
  25.  
  26. int n, m, a[100010], redT[100010], accT[100010];
  27.  
  28. set<int> s[100010];
  29.  
  30. void add(int pos, int v, int *T){
  31. for( ++pos; pos <= n; pos+=pos&-pos)
  32. T[pos] += v;
  33. return;
  34. }
  35.  
  36. int ask(int pos, int *T){
  37. int ret = 0;
  38. for( ++pos; pos; pos-=pos&-pos)
  39. ret += T[pos];
  40. return ret;
  41. }
  42.  
  43. int main(){
  44. //freopen("input.txt","r",stdin);
  45. //freopen("output.txt","w",stdout);
  46. ios_base::sync_with_stdio(false);
  47. cin >> n >> m;
  48. for(int i = 0; i < n; i++)
  49. cin >> a[i], s[a[i]].insert(i);
  50. for(int i = 1; i <= n; i++) s[i].insert(n);
  51.  
  52. for(int i = 0; i < n; i++){
  53. auto it = s[a[i]].upper_bound(i);
  54. int nxt = *it;
  55. add(i, nxt-i, accT);
  56. add(i, nxt-i, redT);
  57. if(nxt == n)
  58. add(n, i-nxt, redT);
  59. if(--it != s[a[i]].begin()){
  60. --it;
  61. int prv = *it;
  62. add(i, prv-i, redT);
  63. }
  64. }
  65.  
  66. for(int i = 0; i < m; i++){
  67. int op; cin >> op;
  68. if(op == 1){
  69. int pos, x; cin >> pos >> x;
  70. --pos;
  71.  
  72. auto it = s[a[pos]].upper_bound(pos);
  73. int nxt = *it;
  74. add(pos, pos-nxt, accT);
  75. add(pos, pos-nxt, redT);
  76. add(nxt, nxt-pos, redT);
  77. --it;
  78. if(it-- != s[a[pos]].begin()){
  79. int prv = *it;
  80. add(prv, prv-pos, accT);
  81. add(prv, nxt-prv, accT);
  82. add(prv, nxt-prv, redT);
  83. add(nxt, prv-nxt, redT);
  84. }
  85. s[a[pos]].erase(pos);
  86.  
  87. a[pos] = x;
  88. it = s[a[pos]].upper_bound(pos);
  89. nxt = *it;
  90. add(pos, nxt-pos, accT);
  91. add(pos, nxt-pos, redT);
  92. add(nxt, pos-nxt, redT);
  93. if(it != s[a[pos]].begin()){
  94. --it;
  95. int prv = *it;
  96. add(prv, prv-nxt, accT);
  97. add(prv, pos-prv, accT);
  98.  
  99. add(prv, prv-nxt, redT);
  100. add(nxt, nxt-prv, redT);
  101. add(prv, pos-prv, redT);
  102. add(pos, prv-pos, redT);
  103. }
  104. s[a[pos]].insert(pos);
  105. }
  106. else{
  107. int l, r; cin >> l >> r; --l, --r;
  108. int res = ask(r, accT)-ask(l-1, accT);
  109. res -= ask(r, redT);
  110. cout << res << endl;
  111. }
  112. }
  113. return 0;
  114. }
  115.  
Success #stdin #stdout 0s 21104KB
stdin
Standard input is empty
stdout
Standard output is empty