Advertisement
Guest User

Untitled

a guest
Mar 18th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.50 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. //#define int long long
  3. using namespace std;
  4.  
  5. const int MAX_N = 1e5 + 47;
  6.  
  7. bool good[MAX_N];
  8.  
  9. vector<int> scanline[MAX_N];
  10.  
  11. int status;
  12.  
  13. int n, m, a[MAX_N];
  14.  
  15. tuple<int, int> q[MAX_N];
  16.  
  17. void zip_zip()
  18. {
  19. vector<int> kek;
  20. for (int i = 1; i <= n; i++)
  21. {
  22. kek.push_back(a[i]);
  23. }
  24. for (int i = 1; i <= m; i++)
  25. {
  26. auto [pos, val] = q[i];
  27. kek.push_back(val);
  28. }
  29. sort(kek.begin(), kek.end());
  30. kek.resize(unique(kek.begin(), kek.end()) - kek.begin());
  31. for (int i = 1; i <= n; i++)
  32. {
  33. a[i] = lower_bound(kek.begin(), kek.end(), a[i]) - kek.begin() + 1;
  34. }
  35. for (int i = 1; i <= m; i++)
  36. {
  37. auto &[pos, val] = q[i];
  38. val = lower_bound(kek.begin(), kek.end(), val) - kek.begin() + 1;
  39. }
  40. }
  41.  
  42. struct node
  43. {
  44. node *l, *r;
  45. int val;
  46. node()
  47. {
  48. l = r = nullptr;
  49. val = 0;
  50. }
  51. node(int x)
  52. {
  53. l = r = nullptr;
  54. val = x;
  55. }
  56. node(node *lf, node *rg)
  57. {
  58. l = lf;
  59. r = rg;
  60. val = max(l->val, r->val);
  61. }
  62. };
  63.  
  64. node *build(int tl, int tr)
  65. {
  66. if (tl == tr)
  67. {
  68. return new node();
  69. }
  70. else
  71. {
  72. int tm = (tl + tr) >> 1;
  73. return new node(build(tl, tm), build(tm + 1, tr));
  74. }
  75. }
  76.  
  77. node *update(node *v, int tl, int tr, int pos, int val)
  78. {
  79. if (tl == tr)
  80. {
  81. val = max(val, v->val);
  82. return new node(val);
  83. }
  84. else
  85. {
  86. int tm = (tl + tr) >> 1;
  87. if (pos <= tm)
  88. {
  89. return new node(update(v->l, tl, tm, pos, val), v->r);
  90. }
  91. else
  92. {
  93. return new node(v->l, update(v->r, tm + 1, tr, pos, val));
  94. }
  95. }
  96. }
  97.  
  98. int get_mx(node *v, int tl, int tr, int l, int r)
  99. {
  100. if (tl > r || tr < l)
  101. {
  102. return 0;
  103. }
  104. if (tl >= l && tr <= r)
  105. {
  106. return v->val;
  107. }
  108. int tm = (tl + tr) >> 1;
  109. return max(get_mx(v->l, tl, tm, l, r), get_mx(v->r, tm + 1, tr, l, r));
  110. }
  111.  
  112. int dp1[MAX_N], dp2[MAX_N], base_mx;
  113.  
  114. void build_good()
  115. {
  116. for (int i = 1; i <= n; i++)
  117. {
  118. for (int j = i + 1; j <= n; j++)
  119. {
  120. if (a[i] < a[j] && dp1[i] + dp2[j] == base_mx)
  121. {
  122. scanline[i + 1].push_back(1);
  123. scanline[j].push_back(-1);
  124. }
  125. }
  126. }
  127. for (int i = 1; i <= n; i++)
  128. {
  129. for (auto x : scanline[i])
  130. {
  131. status += x;
  132. }
  133. if (status != 0)
  134. {
  135. good[i] = 1;
  136. }
  137. }
  138. }
  139.  
  140. const int MAX_V = 8e4;
  141.  
  142. signed main()
  143. {
  144. ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  145. #ifdef _47
  146. freopen("4.cpp", "r", stdin), freopen("7.cpp", "w", stdout);
  147. #endif
  148. cin >> n >> m;
  149. for (int i = 1; i <= n; i++)
  150. {
  151. cin >> a[i];
  152. }
  153. for (int i = 1; i <= m; i++)
  154. {
  155. int pos, val;
  156. cin >> pos >> val;
  157. q[i] = {pos, val};
  158. }
  159. node *p[n + 1], *s[n + 2];
  160. p[0] = build(1, MAX_V);
  161. s[n + 1] = build(1, MAX_V);
  162. for (int i = 1; i <= n; i++)
  163. {
  164. int new_val = get_mx(p[i - 1], 1, MAX_V, 1, a[i] - 1) + 1;
  165. dp1[i] = new_val;
  166. p[i] = update(p[i - 1], 1, MAX_V, a[i], new_val);
  167. }
  168. for (int i = n; i >= 1; i--)
  169. {
  170. int new_val = get_mx(s[i + 1], 1, MAX_V, a[i] + 1, MAX_V) + 1;
  171. dp2[i] = new_val;
  172. s[i] = update(s[i + 1], 1, MAX_V, a[i], new_val);
  173. }
  174. base_mx = get_mx(p[n], 1, MAX_V, 1, MAX_V);
  175. build_good();
  176. for (int i = 1; i <= m; i++)
  177. {
  178. auto [pos, val] = q[i];
  179. int ans = base_mx - 1;
  180. if (good[pos])
  181. {
  182. ans = max(ans, base_mx);
  183. }
  184. ans = max(ans, get_mx(p[pos - 1], 1, MAX_V, 1, val - 1) + get_mx(s[pos + 1], 1, MAX_V, val + 1, MAX_V) + 1);
  185. cout << ans << '\n';
  186. }
  187. return 0;
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement