Advertisement
Guest User

Untitled

a guest
Dec 15th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.65 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4.  
  5. #define re return
  6. #define pb push_back
  7. #define po pop_back
  8. #define all(x) (x).begin(), (x).end()
  9. #define fi first
  10. #define se second
  11. #define sqrt(x) sqrt(abs(x))
  12. #define mp make_pair
  13. #define pi 3.14159265359
  14. #define fo(i, n) for(int i = 0; i < n; ++i)
  15. #define ro(i, n) for(int i = n - 1; i >= 0; --i)
  16. #define fill(x, y) memset(x, y, sizeof(x))
  17.  
  18.  
  19. typedef vector<int> vi;
  20. typedef vector<vi> vvi;
  21. typedef pair<int, int> ii;
  22. typedef vector<ii> vii;
  23. typedef vector<string> vs;
  24. typedef double D;
  25. typedef long double ld;
  26. typedef long long ll;
  27. typedef pair<ll, ll> pll;
  28. typedef vector<ll> vll;
  29.  
  30. const int maxn = 2 * ((int) 1e5);
  31. ll a[maxn];
  32. ll b[maxn];
  33. ll now[maxn];
  34. int n;
  35. int len;
  36.  
  37. inline ll get_min(int l, int r) {
  38. ll ans = (ll) 1e18;
  39. --ans;
  40. int cl = l / len, cr = r / len;
  41. if (cl == cr) {
  42. for(int i = l; i <= r; ++i) ans = min(ans, a[i] + now[i / len]);
  43. } else {
  44. int end = (cl + 1) * len;
  45. for(int i = l; i < end; ++i) ans = min(ans, a[i] + now[i / len]);
  46. for(int i = cl + 1; i < cr; ++i) ans = min(ans, b[i]);
  47. for(int i = cr * len; i <= r; ++i) ans = min(ans, a[i] + now[i / len]);
  48. }
  49. re ans;
  50. }
  51.  
  52. inline void update(int l, int r, int p) {
  53. int cl = l / len, cr = r / len;
  54. if (cl == cr) {
  55. for(int i = l; i <= r; ++i) a[i] += p;
  56. } else {
  57. int end = (cl + 1) * len;
  58. for(int i = l; i < end; ++i) a[i] += p;
  59. for(int i = cl + 1; i < cr; ++i) {
  60. b[i] += p;
  61. now[i] += p;
  62. }
  63. for(int i = cr * len; i <= r; ++i) a[i] += p;
  64. }
  65. ///
  66. {
  67. int j = (l / len) * len;
  68. b[j / len] = (ll) 1e18;
  69. --b[j / len];
  70. for(int i = j; i < j + len && i < n; ++i) b[i / len] = min(b[i / len], a[i] + now[i / len]);
  71. }
  72. {
  73. int j = (r / len) * len;
  74. b[j / len] = (ll) 1e18;
  75. --b[j / len];
  76. for(int i = j; i < n && i < j + len; ++i) b[i / len] = min(b[i / len], a[i] + now[i / len]);
  77. }
  78. }
  79.  
  80. int main() {
  81. scanf("%d", &n);
  82. fo(i, n) {
  83. int x;
  84. scanf("%d", &x);
  85. a[i] = x;
  86. b[i] = (ll) 1e18;
  87. --b[i];
  88. }
  89. len = (int)(sqrt(n)) + 1;
  90. for(int i = 0; i < n; i += len) {
  91. for(int j = i; j < n && j < i + len; ++j) {
  92. b[i / len] = min(b[i / len], a[j]);
  93. }
  94. }
  95. int m;
  96. scanf("%d\n", &m);
  97. char c[100];
  98. fo(i, m) {
  99. gets(c);
  100. int q = 0;
  101. int l = 0, r = 0, p = 0;
  102. for (int i = 0; c[i] != '\n' && c[i] != '\0'; ++i) {
  103. if (!isdigit(c[i]) && c[i] != '-') continue;
  104. string str;
  105. while(isdigit(c[i]) || c[i] == '-') str += c[i++];
  106. //cout << "!!" << str << ' ' << i << endl;
  107. switch (q) {
  108. case 0:
  109. l = atoi(str.c_str());
  110. break;
  111. case 1:
  112. r = atoi(str.c_str());
  113. break;
  114. case 2:
  115. p = atoi(str.c_str());
  116. break;
  117. }
  118. --i;
  119. ++q;
  120. }
  121. if (q == 2) {
  122. ll ans = (ll) 1e18;
  123. --ans;
  124. if (l > r) {
  125. ans = min (ans, get_min(0, r));
  126. ans = min (ans, get_min(l, n - 1));
  127. }
  128. else ans = get_min(l, r);
  129. printf ("%I64d\n", ans);
  130. }
  131. else {
  132. if (l > r) {
  133. update(0, r, p);
  134. update(l, n - 1, p);
  135. }
  136. else update(l, r, p);
  137. }
  138. }
  139. re 0;
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement