Guest User

Untitled

a guest
Nov 2nd, 2015
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.97 KB | None | 0 0
  1. #pragma commet(linker, "/STACK:256000000")
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #define FILEOUTPUT
  4. #include <iostream>
  5. #include <fstream>
  6. #include <sstream>
  7. #include <iomanip>
  8. #include <limits.h>
  9. #include <algorithm>
  10. #include <functional>
  11. #include <utility>
  12. #include <vector>
  13. #include <set>
  14. #include <stack>
  15. #include <map>
  16. #include <list>
  17. #include <queue>
  18. #include <string>
  19. #include <memory>
  20. #include <cmath>
  21. #include <ctime>
  22. #include <cctype>
  23. #include <cstdarg>
  24. #include <cstdlib>
  25. #include <cstdio>
  26. #include <unordered_map>
  27. using namespace std;
  28. typedef int int_32;
  29. #define int ll
  30. typedef long double ld;
  31. typedef long long ll;
  32. typedef unsigned long long ull;
  33. typedef pair<int, int> pii;
  34. typedef vector<int> vi;
  35. template<class T> void read_int(T& x){ cin >> x; }
  36. template<class T, class ...Tail> void read_int(T& x, Tail&... tail){
  37.     cin >> x;
  38.     read_int(tail...);
  39. }
  40. template<class T> inline const T sqr(const T& x) {
  41.     return x*x;
  42. }
  43. template<class T> inline bool isIn(const T& a, const T& b, const T& x) {
  44.     return a <= x && x < b;
  45. }
  46. template<class T> const T binPow(T x, int n, T e){
  47.     while (n){
  48.         if (n & 1)
  49.             e *= x;
  50.         x *= x;
  51.         n >>= 1;
  52.     }
  53.     return e;
  54. }
  55. template<class T> const T binPow(T x, int n, T e, int MOD){
  56.     while (n){
  57.         if (n & 1)
  58.             e = (e*x) % MOD;
  59.         x = (x*x) % MOD;
  60.         n >>= 1;
  61.     }
  62.     return e;
  63. }
  64. #define in(...) int __VA_ARGS__; read_int(__VA_ARGS__)
  65. #define iv(vec) for(int i = 0; i < vec.size(); cin >> vec[i++])
  66. #define ov(vec, x) for(auto it = vec.begin(); it != vec.end(); cout << *it << x, ++it)
  67. #define mp make_pair
  68. #define all(vec) vec.begin(), vec.end()
  69. #define so(vec) sort(all(vec))
  70. #define re(vec) reverse(all(vec))
  71. int bin_search(int left, int right, bool possibleFor(int)){
  72.     int middle;
  73.     while (left <= right){
  74.         middle = (left + right) >> 1;
  75.         if (possibleFor(middle))
  76.             left = middle + 1;
  77.         else
  78.             right = middle - 1;
  79.     }
  80.     return right;
  81. }
  82. const int INF = 1e9 + 7;
  83. const int LINF = sqr(INF - 7) + 7;
  84. const ld EPS = 1e-13;
  85. const string fileName = "different";
  86. const string ProblemName = "last";
  87. void run();
  88. void save(){
  89.     char k;
  90.     ofstream saveTo(ProblemName + ".cpp");
  91.     ifstream saveFrom("Source.cpp");
  92.     while (saveFrom.get(k)) saveTo << k;
  93. }
  94. int_32 main(){
  95.     ios_base::sync_with_stdio(0);
  96.     cout << fixed << setprecision(13);
  97.     cout.tie();
  98.     cin.tie();
  99.     srand(time(NULL));
  100. #ifdef TRAINING
  101.     save();
  102.     freopen("in.txt", "r", stdin);
  103.     //freopen("out.txt", "w", stdout);
  104. #else
  105. #ifdef FILEOUTPUT
  106.     freopen((fileName + ".in").c_str(), "r", stdin);
  107.     freopen((fileName + ".out").c_str(), "w", stdout);
  108. #endif
  109. #endif
  110.     run();
  111.     return 0;
  112. }
  113.  
  114. class segment_tree{
  115.     vector< pair<int,int> > treeMemory;
  116.     const int realSize;
  117.     void build(const vector<int>& v, int left, int right, int curr = 1){
  118.         if (left == right){
  119.             treeMemory[curr] = mp(v[left],0);
  120.             return;
  121.         }
  122.         int middle = (left + right) >> 1;
  123.         build(v, left, middle, curr << 1);
  124.         build(v, middle + 1, right, (curr << 1) + 1);
  125.         treeMemory[curr] = mp(max(treeMemory[curr << 1].first, treeMemory[(curr << 1) + 1].first), 0);
  126.     }
  127.     void push(int curr){
  128.         treeMemory[curr << 1].second += treeMemory[curr].second;
  129.         treeMemory[(curr << 1) + 1].second += treeMemory[curr].second;
  130.         treeMemory[curr].second = 0;
  131.     }
  132.     void update(int value, int rl, int rr, int tl, int tr, int v = 1){
  133.         if (rl > rr)
  134.             return;
  135.         if (rl == tl && rr == tr){
  136.             treeMemory[v].second += value;
  137.             return;
  138.         }
  139.         push(v);
  140.         int tm = (tl + tr) >> 1;
  141.         update(value, rl, min(tm, rr), tl, tm, v << 1);
  142.         update(value, max(rl, tm + 1), rr, tm + 1, tr, (v << 1) + 1);
  143.         treeMemory[v].first = max(treeMemory[v << 1].second + treeMemory[v << 1].first, treeMemory[(v << 1) + 1].second + treeMemory[(v << 1) + 1].first);
  144.     }
  145.     const int get(int rl, int rr, int tl, int tr, int v = 1){
  146.         if (rl > rr)
  147.             return 0;
  148.         if (rl == tl && rr == tr){
  149.             return treeMemory[v].first + treeMemory[v].second;
  150.         }
  151.         push(v);
  152.         int tm = (tl + tr) >> 1;
  153.         return max(
  154.             get(rl, min(rr, tm), tl, tm, v << 1),
  155.             get(max(rl, tm + 1), rr, tm + 1, tr, (v << 1) + 1)
  156.             ) + treeMemory[v].second;
  157.     }
  158. public:
  159.     segment_tree(const vector<int>& vecForTree) :treeMemory(vecForTree.size() << 2), realSize(vecForTree.size()){
  160.         build(vecForTree, 0, realSize - 1);
  161.     }
  162.     const int operator()(int l, int r){
  163.         return get(l, r, 0, realSize - 1);
  164.     }
  165.     const int operator[](int index){
  166.         return operator()(index, index);
  167.     }
  168.     void treeUpdate(int v, int l, int r){
  169.         update(v, l, r, 0, realSize - 1);
  170.     }
  171. };
  172.  
  173. pair<int, int> findMinimal(int v, set<int>& pos){
  174.     auto it = pos.find(v);
  175.     pair<int, int> res(-INF, INF);
  176.     if (it != pos.begin()){
  177.         --it;
  178.         res.first = *it;
  179.         ++it;
  180.     }
  181.     if (++it != pos.end()){
  182.         res.second = *it;
  183.     }
  184.     return res;
  185. }
  186.  
  187. void run(){
  188.     in(n,m,k);
  189.     vi vec(n);
  190.     iv(vec);
  191.     map<int, set<int> > poses;
  192.     vi bucket(1000001, 0);
  193.     vi vecForTree(n);
  194.     int c = 0;
  195.     for (int i = 0; i < k; ++i){
  196.         if (bucket[vec[i]] == 0){
  197.             ++c;
  198.         }
  199.         ++bucket[vec[i]];
  200.         poses[vec[i]].insert(i);
  201.         vecForTree[i] = c;
  202.     }
  203.     for (int i = k; i < n; ++i){
  204.         if (bucket[vec[i - k]] == 1){
  205.             --c;
  206.         }
  207.         --bucket[vec[i - k]];
  208.         if (bucket[vec[i]] == 0){
  209.             ++c;
  210.         }
  211.         ++bucket[vec[i]];
  212.         poses[vec[i]].insert(i);
  213.         vecForTree[i] = c;
  214.     }
  215.     segment_tree tree(vecForTree);
  216.     int a, b;
  217.     pair<int, int> upgradePos;
  218.     for (int i = 0; i < m; ++i){
  219.         cin >> c >> a >> b;
  220.         --a;
  221.         if (c == 1){
  222.             set<int>& from = poses[vec[a]];
  223.             set<int>& to = poses[b];
  224.            
  225.             upgradePos = findMinimal(a, from);
  226.             upgradePos.first = max(a, upgradePos.first + k);
  227.             upgradePos.second = min(n - 1, min(a + k - 1, upgradePos.second - 1));
  228.             tree.treeUpdate(-1, upgradePos.first, upgradePos.second);
  229.             from.erase(a);
  230.  
  231.             to.insert(a);
  232.             upgradePos = findMinimal(a, to);
  233.             upgradePos.first = max(a, upgradePos.first + k);
  234.             upgradePos.second = min(n - 1, min(a + k - 1, upgradePos.second - 1));
  235.             tree.treeUpdate(1, upgradePos.first, upgradePos.second);
  236.  
  237.             vec[a] = b;
  238.         }
  239.         else
  240.             cout << tree(a + k - 1, b - 1) << endl;
  241.     }
  242.  
  243. }
Advertisement
Add Comment
Please, Sign In to add comment