Guest User

Untitled

a guest
Mar 6th, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.09 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace::std;
  4.  
  5. struct vert {
  6. int lewy, pref, sr, suf, prawy;
  7. };
  8.  
  9. const int N = 500005, z = 8;
  10. vert d[2 * z];
  11. int n, m;
  12.  
  13. void wstaw(int x, int v) {
  14. v += z;
  15. d[v] = {x, 1, 0, 1, x};
  16. v /= 2;
  17. while (v > 0) {
  18. d[v].lewy = d[2 * v].lewy;
  19. d[v].prawy = d[2 * v + 1].prawy;
  20. if (d[2 * v].prawy < d[2 * v + 1].lewy) {
  21. if (d[2 * v].pref == d[2 * v].suf) d[v].pref = d[2 * v].suf + d[2 * v + 1].pref;
  22. else d[v].pref = d[2 * v].pref;
  23.  
  24. if (d[2 * v + 1].pref == d[2 * v + 1].suf) d[v].suf = d[2 * v].suf + d[2 * v + 1].pref;
  25. else d[v].suf = d[2 * v + 1].suf;
  26.  
  27.  
  28. if (d[2 * v].pref != d[2 * v].suf && d[2 * v + 1].pref != d[2 * v + 1].suf) d[v].sr = max(max(d[2 * v].sr, d[2 * v + 1].sr), d[2 * v].suf + d[2 * v + 1].pref);
  29. else if (d[2 * v + 1].pref != d[2 * v + 1].suf) d[v].sr = d[2 * v + 1].sr;
  30. else if (d[2 * v].pref != d[2 * v].suf) d[v].sr = d[2 * v].sr;
  31. } else {
  32. d[v].pref = d[2 * v].pref;
  33. d[v].suf = d[2 * v + 1].suf;
  34. if (d[2 * v].pref != d[2 * v].suf && d[2 * v + 1].pref != d[2 * v + 1].suf) d[v].sr = max(max(d[2 * v].sr, d[2 * v + 1].sr), max(d[2 * v].suf, d[2 * v + 1].pref));
  35. else if (d[2 * v].pref != d[2 * v].suf) d[v].sr = max(d[2 * v].sr, d[2 * v].suf);
  36. else if (d[2 * v + 1].pref != d[2 * v + 1].suf) d[v].sr = max(d[2 * v + 1].sr, d[2 * v + 1].pref);
  37. }
  38. v /= 2;
  39. }
  40. }
  41.  
  42. void show() {
  43. int pp = 1;
  44. for (int v = 1; v < 2 * z; v++) {
  45. printf("(%d|%d,%d,%d)", v, d[v].pref, d[v].sr, d[v].suf);
  46. if (v == pp) {
  47. pp = 2 * pp + 1;
  48. printf("\n");
  49. }
  50. }
  51. printf("\n");
  52. }
  53.  
  54. int main() {
  55. scanf("%d", &n);
  56. //for (int i = 0; i < z; i++) wstaw(1000, i);
  57. for (int i = 0; i < n; i++) {
  58. int x;
  59. scanf("%d", &x);
  60. wstaw(x, i);
  61. }
  62. scanf("%d", &m);
  63. show();
  64. printf("%d\n", max(max(d[1].pref, d[1].sr), d[1].suf));
  65. for (int i = 0; i < m; i++) {
  66. int v, x;
  67. scanf("%d%d", &v, &x);
  68. wstaw(x, v - 1);
  69. show();
  70. printf("%d\n", max(max(d[1].pref, d[1].sr), d[1].suf));
  71. printf("%d, %d, %d\n", d[1].pref, d[1].sr, d[1].suf);
  72. }
  73.  
  74. }
  75. /* 8
  76. 4 2 3 1 4 1 2 3
  77. 1
  78. 2 2
  79. */
Advertisement
Add Comment
Please, Sign In to add comment