Advertisement
Rwarazor

Untitled

Dec 7th, 2019
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.01 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cassert>
  4. #include <cstdio>
  5. #include <algorithm>
  6. #include <set>
  7. #include <math.h>
  8. #include <string>
  9. #include <map>
  10. #include <unordered_map>
  11. #include <unordered_set>
  12. #include <deque>
  13. #include <iomanip>
  14. #pragma GCC optimize(-Ofast)
  15.  
  16. #define pr pair
  17. #define mp make_pair
  18. #define ft first
  19. #define sd second
  20. #define ll long long
  21. #define ld long double
  22.  
  23. using namespace std;
  24.  
  25. #ifdef FAST_ALLOCATOR_MEMORY
  26. int allocator_pos = 0;
  27. char allocator_memory[(int)FAST_ALLOCATOR_MEMORY];
  28. inline void* operator new (size_t n) {
  29. char* res = allocator_memory + allocator_pos;
  30. allocator_pos += n;
  31. assert(allocator_pos <= (int)FAST_ALLOCATOR_MEMORY);
  32. return (void*)res;
  33. }
  34. inline void operator delete (void*) noexcept { }
  35. //inline void * operator new [] ( size_t ) { assert(0); }
  36. //inline void operator delete [] ( void * ) { assert(0); }
  37. #endif
  38.  
  39. inline int readUInt();
  40. inline int readChar();
  41. inline bool isEof();
  42. inline int getChar();
  43.  
  44. static const int buf_size = 4096;
  45. static unsigned char buf[buf_size];
  46. static int buf_len = 0, buf_pos = 0;
  47.  
  48. inline bool isEof() {
  49. if (buf_pos == buf_len) {
  50. buf_pos = 0, buf_len = fread(buf, 1, buf_size, stdin);
  51. if (buf_pos == buf_len)
  52. return 1;
  53. }
  54. return 0;
  55. }
  56. inline int getChar() {
  57. return isEof() ? -1 : buf[buf_pos++];
  58. }
  59. inline int readChar() {
  60. int c = getChar();
  61. while (c != -1 && c <= 32)
  62. c = getChar();
  63. return c;
  64. }
  65. inline int readUInt() {
  66. int c = readChar(), x = 0;
  67. while ('0' <= c && c <= '9')
  68. x = x * 10 + c - '0', c = getChar();
  69. return x;
  70. }
  71.  
  72.  
  73. inline int superRand() {
  74. if (RAND_MAX == (1 << 15) - 1) {
  75. return (rand() << 15) + rand();
  76. }
  77. return rand();
  78. }
  79.  
  80. struct Node {
  81. int key, prior, sz;
  82. ll sum;
  83. Node* l, * r, * p;
  84. inline Node() {};
  85. inline Node(int key_) :
  86. l(nullptr),
  87. r(nullptr),
  88. prior(superRand()),
  89. sz(1),
  90. sum(key),
  91. key(key_)
  92. {};
  93. };
  94.  
  95. typedef Node* Pnode;
  96.  
  97.  
  98. inline int get_size(Pnode root) {
  99. if (root != nullptr)
  100. return root->sz;
  101. return 0;
  102. }
  103. inline ll get_sum(Pnode root) {
  104. if (root != nullptr)
  105. return root->sum;
  106. else
  107. return 0;
  108. }
  109. inline void update(Pnode root) {
  110. if (root != nullptr) {
  111. root->sz = get_size(root->l) + get_size(root->r) + 1;
  112. root->sum = get_sum(root->l) + get_sum(root->r) + root->key;
  113. }
  114. }
  115. void forceupdate(Pnode root) {
  116. if (root->l != nullptr)
  117. forceupdate(root->l);
  118. if (root->r != nullptr)
  119. forceupdate(root->r);
  120. update(root);
  121. }
  122. void splitbykey(Pnode root, Pnode& l, Pnode& r, int x) {
  123. if (root == nullptr)
  124. return void(l = r = nullptr);
  125. if (root->key < x) {
  126. splitbykey(root->r, root->r, r, x);
  127. l = root;
  128. }
  129. else {
  130. splitbykey(root->l, l, root->l, x);
  131. r = root;
  132. }
  133. update(r);
  134. update(l);
  135. }
  136. void splitbysz(Pnode root, Pnode& l, Pnode& r, int k) {
  137. if (root == nullptr)
  138. return void(l = r = 0);
  139. if (get_size(root->l) >= k) {
  140. splitbysz(root->l, l, root->l, k);
  141. r = root;
  142. }
  143. else {
  144. splitbysz(root->r, root->r, r, k - get_size(root->l) - 1);
  145. l = root;
  146. }
  147. update(root);
  148. }
  149. void mymerge(Pnode& root, Pnode l, Pnode r) {
  150. if (!l || !r)
  151. return void(root = l ? l : r);
  152. if (l->prior > r->prior) {
  153. mymerge(l->r, l->r, r);
  154. root = l;
  155. }
  156. else {
  157. mymerge(r->l, l, r->l);
  158. root = r;
  159. }
  160. update(root);
  161. }
  162. inline void insert(Pnode root, Pnode ins) {
  163. Pnode l, r;
  164. splitbykey(root, l, r, ins->key);
  165. mymerge(root, l, ins);
  166. mymerge(root, root, r);
  167. }
  168. inline void erase(Pnode root, int x) {
  169. Pnode l, m, r;
  170. splitbykey(root, l, m, x);
  171. splitbysz(m, m, r, 1);
  172. mymerge(root, l, r);
  173. }
  174.  
  175.  
  176. int a[100000];
  177. Pnode trees[400228];
  178.  
  179. vector<int> build1(int n, int l, int r) {
  180. vector<int> nodes;
  181. if (r - l == 1)
  182. nodes = { a[l] };
  183. else {
  184. int m = (l + r) / 2;
  185. vector<int> nodes1 = build1(2 * n + 1, l, m);
  186. vector<int> nodes2 = build1(2 * n + 2, m, r);
  187. nodes.resize(r - l);
  188. merge(nodes1.begin(), nodes1.end(), nodes2.begin(), nodes2.end(), nodes.begin());
  189. }
  190. trees[n] = new Node(0);
  191. trees[n]->prior = INT32_MAX;
  192. Pnode cur = trees[n];
  193. for (int i = 0; i < r - l; ++i) {
  194. Pnode newnode = new Node(nodes[i]);
  195. while (cur->prior < newnode->prior)
  196. cur = cur->p;
  197. newnode->l = cur->r;
  198. if (cur->r != nullptr)
  199. cur->r->p = newnode;
  200. cur->r = newnode;
  201. newnode->p = cur;
  202. cur = newnode;
  203. }
  204. forceupdate(trees[n]);
  205. return nodes;
  206. }
  207.  
  208. int pos, oldval, newval;
  209.  
  210. void change(int n, int l, int r) {
  211. erase(trees[n], oldval);
  212. insert(trees[n], new Node(newval));
  213. if (r - l != 1) {
  214. int m = (l + r) / 2;
  215. if (m <= pos)
  216. change(2 * n + 2, m, r);
  217. else
  218. change(2 * n + 1, l, m);
  219. }
  220. }
  221.  
  222. int l1, r1, a1, b1;
  223.  
  224. pair<ll, int> ask(int n, int l, int r) {
  225. if (l >= r1 || r <= l1)
  226. return mp(0, 0);
  227. if (l >= l1 && r <= r1) {
  228. pr<ll, int> ans;
  229. Pnode L, M, R;
  230. splitbykey(trees[n], L, M, a1);
  231. splitbykey(M, M, R, b1 + 1);
  232. ans.first = get_sum(M);
  233. ans.second = get_size(M);
  234. mymerge(M, M, R);
  235. mymerge(trees[n], L, M);
  236. return ans;
  237. }
  238. else {
  239. int m = (l + r) / 2;
  240. pr<ll, int> ans1 = ask(2 * n + 1, l, m), ans2 = ask(2 * n + 2, m, r);
  241. return mp(ans1.ft + ans2.ft, ans1.sd + ans2.sd);
  242. }
  243. }
  244.  
  245. int main()
  246. {
  247. int n;
  248. //n = readUInt();
  249. cin >> n;
  250. srand(time(NULL));
  251. for (int i = 0; i < n; i++) {
  252. //a[i] = readUInt();
  253. cin >> a[i];
  254. }
  255. build1(0, 0, n);
  256. int q;
  257. //q = readUInt();
  258. cin >> q;
  259. cout << setprecision(20);
  260. short type;
  261. for (int i = 0; i < q; ++i) {
  262. cin >> type;
  263. //type = readUInt();
  264. if (type == 1) {
  265. /*l1 = readUInt();
  266. r1 = readUInt();
  267. a1 = readUInt();
  268. b1 = readUInt();*/
  269. cin >> l1 >> r1 >> a1 >> b1;
  270. --l1;
  271. auto ans = ask(0, 0, n);
  272. if (ans.second == 0)
  273. cout << 0 << ' ';
  274. else
  275. cout << (ld)ans.first / (ld)ans.second << ' ';
  276. }
  277. else {
  278. /*l1 = readUInt();
  279. r1 = readUInt();*/
  280. cin >> l1 >> r1;
  281. if (a[l1 - 1] != a[r1 - 1]) {
  282. pos = l1 - 1, oldval = a[l1 - 1], newval = a[r1 - 1];
  283. change(0, 0, n);
  284. pos = r1 - 1, oldval = a[r1 - 1], newval = a[l1 - 1];
  285. change(0, 0, n);
  286. swap(a[l1 - 1], a[r1 - 1]);
  287. }
  288. }
  289. }
  290. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement