Advertisement
a53

QMunte_CAC

a53
Jun 14th, 2017
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.44 KB | None | 0 0
  1. #include <fstream>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. const int NMAX = 100000 + 5;
  8.  
  9. int N;
  10. int v[NMAX];
  11.  
  12. struct Node {
  13. int st, dr;
  14. int cnt;
  15. vector <int> stk;
  16. } tree[4 * NMAX];
  17.  
  18. void unite(Node &res, const Node a, const Node &b) {
  19. if (res.dr == -1) {
  20. res = b;
  21. return ;
  22. }
  23.  
  24. res.cnt = a.cnt + b.cnt;
  25. res.stk = a.stk;
  26. for (auto it: b.stk) {
  27. while (res.stk.size() > 1 && res.stk[res.stk.size() - 2] < res.stk[res.stk.size() - 1] && res.stk[res.stk.size() - 1] > it)
  28. res.cnt ++, res.stk.pop_back();
  29. res.stk.push_back(it);
  30. }
  31. }
  32.  
  33. void build(int node, int st, int dr) {
  34. tree[node].st = st, tree[node].dr = dr;
  35.  
  36. if (tree[node].st == tree[node].dr) {
  37. tree[node].stk.push_back(v[st]);
  38. return ;
  39. }
  40.  
  41. int mid = (st + dr) >> 1;
  42. build(node << 1, st, mid);
  43. build((node << 1) + 1, mid + 1, dr);
  44.  
  45. unite(tree[node], tree[node << 1], tree[(node << 1) + 1]);
  46. }
  47.  
  48. Node res;
  49. void query(int node, int st, int dr) {
  50. if (tree[node].st == st && tree[node].dr == dr) {
  51. unite(res, res, tree[node]);
  52. return ;
  53. }
  54.  
  55. int mid = (tree[node].st + tree[node].dr) >> 1;
  56. if (dr <= mid)
  57. query(node << 1, st, dr);
  58. else if (st > mid)
  59. query((node << 1) + 1, st, dr);
  60. else {
  61. query(node << 1, st, mid);
  62. query((node << 1) + 1, mid + 1, dr);
  63. }
  64. }
  65.  
  66. void update(int node, int where, int val) {
  67. if (tree[node].st == tree[node].dr) {
  68. tree[node].stk = {val};
  69. v[where] = val;
  70. return ;
  71. }
  72.  
  73. int mid = (tree[node].st + tree[node].dr) >> 1;
  74. if (where <= mid)
  75. update(node << 1, where, val);
  76. else
  77. update((node << 1) + 1, where, val);
  78. unite(tree[node], tree[node << 1], tree[(node << 1) + 1]);
  79. }
  80.  
  81. int main()
  82. {
  83. ifstream cin("qmunte.in");
  84. ofstream cout("qmunte.out");
  85.  
  86. int M = 0;
  87. cin >> N >> M;
  88.  
  89. for (int i = 1; i <= N; ++ i)
  90. cin >> v[i];
  91. build(1, 1, N);
  92. cerr << "DONE BUILD" << endl;
  93.  
  94. for (int i = 1; i <= M; ++ i) {
  95. int type, a, b;
  96. cin >> type >> a >> b;
  97.  
  98. if (type == 1)
  99. update(1, a, b);
  100. else {
  101. res.dr = -1;
  102. query(1, a, b);
  103. cout << res.cnt << '\n';
  104. }
  105.  
  106. if (i % 10000 == 0)
  107. cerr << "DONE " << i << endl;
  108. }
  109. return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement