Advertisement
bibaboba12345

E

Dec 21st, 2021
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.08 KB | None | 0 0
  1. #pragma GCC target ("avx2")
  2. #pragma GCC optimization ("O3")
  3. #pragma GCC optimization ("unroll-loops")
  4. #include <iostream>
  5. #include <queue>
  6. #include <vector>
  7. #include <algorithm>
  8. #include <cmath>
  9. #include <string>
  10. #include <random>
  11. #define rand() abs((long long)(rnd()))
  12.  
  13.  
  14. using namespace std;
  15. mt19937 rnd(1337);
  16. const int N = 524288 * 2; // 2^20, ne zabud vernut *2
  17. const long long M = 1e9 + 7;
  18.  
  19. int n, q;
  20.  
  21. long long a[N], b[N], st[61], ODIN;
  22. struct Node {
  23. int sum[61];
  24. int dlt[61];
  25. int len;
  26. };
  27.  
  28. struct SegTree {
  29. Node tree[N];
  30. void init() {
  31. for (int i = N - 1; i >= 1; i--) {
  32. if (i >= N / 2) {
  33. long long x = a[i - N / 2];
  34. for (int j = 60; j >= 0; j--) {
  35. tree[i].sum[j] = x / st[j];
  36. tree[i].dlt[j] = -1;
  37. x = x % st[j];
  38. }
  39. tree[i].len = 1;
  40. }
  41. else {
  42. for (int j = 60; j >= 0; j--) {
  43. tree[i].sum[j] = tree[i * 2].sum[j] + tree[i * 2 + 1].sum[j];
  44. tree[i].dlt[j] = -1;
  45.  
  46. }
  47. tree[i].len = tree[i * 2].len * 2;
  48. }
  49. }
  50. }
  51. void push(int v) {
  52. if (v >= N / 2) {
  53. return;
  54. }
  55. for (int j = 0; j < 61; j++) {
  56. if (tree[v].dlt[j] == -1) {
  57. continue;
  58. }
  59. if (tree[v].dlt[j] == 0) {
  60. tree[v * 2].sum[j] = 0;
  61. tree[v * 2 + 1].sum[j] = 0;
  62. tree[v * 2].dlt[j] = 0;
  63. tree[v * 2 + 1].dlt[j] = 0;
  64. }
  65. if (tree[v].dlt[j] == 1) {
  66. tree[v * 2].sum[j] = tree[v * 2].len;
  67. tree[v * 2 + 1].sum[j] = tree[v * 2 + 1].len;
  68. tree[v * 2].dlt[j] = 1;
  69. tree[v * 2 + 1].dlt[j] = 1;
  70. }
  71. if (tree[v].dlt[j] == 2) {
  72. tree[v * 2].sum[j] = tree[v * 2].len - tree[v * 2].sum[j];
  73. tree[v * 2 + 1].sum[j] = tree[v * 2 + 1].len - tree[v * 2 + 1].sum[j];
  74. tree[v * 2].dlt[j] = 2;
  75. tree[v * 2 + 1].dlt[j] = 2;
  76. }
  77. tree[v].dlt[j] = -1;
  78. }
  79. }
  80.  
  81. void update(int v) {
  82. v /= 2;
  83. while (v > 0) {
  84. for (int j = 0; j < 61; j++) {
  85. tree[v].sum[j] = tree[v * 2].sum[j] + tree[v * 2 + 1].sum[j];
  86. }
  87. v /= 2;
  88. }
  89. }
  90.  
  91. void And(int v, int l, int r, int L, int R, long long x) {
  92. if (R < l || L > r) {
  93. return;
  94. }
  95. push(v);
  96. if (l >= L && r <= R) {
  97. for (int j = 60; j >= 0; j--) {
  98. if (x >= st[j]) {
  99. x -= st[j];
  100. }
  101. else {
  102. tree[v].sum[j] = 0;
  103. tree[v].dlt[j] = 0;
  104. }
  105. }
  106. update(v);
  107. return;
  108. }
  109.  
  110. And(v * 2, l, (l + r) / 2, L, R, x);
  111. And(v * 2 + 1, (l + r) / 2 + 1, r, L, R, x);
  112. }
  113. void Or(int v, int l, int r, int L, int R, long long x) {
  114. if (R < l || L > r) {
  115. return;
  116. }
  117. push(v);
  118. if (l >= L && r <= R) {
  119. for (int j = 60; j >= 0; j--) {
  120. if (x >= st[j]) {
  121. x -= st[j];
  122. tree[v].sum[j] = tree[v].len;
  123. tree[v].dlt[j] = 1;
  124. }
  125. else {
  126.  
  127. }
  128. }
  129. update(v);
  130. return;
  131. }
  132.  
  133. Or(v * 2, l, (l + r) / 2, L, R, x);
  134. Or(v * 2 + 1, (l + r) / 2 + 1, r, L, R, x);
  135. }
  136. void Xor(int v, int l, int r, int L, int R, long long x) {
  137. if (R < l || L > r) {
  138. return;
  139. }
  140. push(v);
  141. if (l >= L && r <= R) {
  142. for (int j = 60; j >= 0; j--) {
  143. if (x >= st[j]) {
  144. x -= st[j];
  145. tree[v].sum[j] = tree[v].len - tree[v].sum[j];
  146. tree[v].dlt[j] = 2;
  147. }
  148. else {
  149.  
  150. }
  151. }
  152. update(v);
  153. return;
  154. }
  155.  
  156. Xor(v * 2, l, (l + r) / 2, L, R, x);
  157. Xor(v * 2 + 1, (l + r) / 2 + 1, r, L, R, x);
  158. }
  159.  
  160. void xors(int l, int r, long long x) {
  161. Xor(1, 1, N / 2, l, r, x);
  162. }
  163. void ors(int l, int r, long long x) {
  164. Or(1, 1, N / 2, l, r, x);
  165. }
  166. void ands(int l, int r, long long x) {
  167. And(1, 1, N / 2, l, r, x);
  168. }
  169.  
  170. long long get_and(int v, int l, int r, int L, int R) {
  171. if (R < l || L > r) {
  172. return ODIN;
  173. }
  174. push(v);
  175. if (l >= L && r <= R) {
  176. long long x = 0;
  177. for (int j = 60; j >= 0; j--) {
  178. if (tree[v].sum[j] == tree[v].len) {
  179. x += st[j];
  180. }
  181. }
  182. return x;
  183. }
  184.  
  185. return get_and(v * 2, l, (l + r) / 2, L, R) &
  186. get_and(v * 2 + 1, (l + r) / 2 + 1, r, L, R);
  187. }
  188.  
  189. long long get_or(int v, int l, int r, int L, int R) {
  190. if (R < l || L > r) {
  191. return 0;
  192. }
  193. push(v);
  194. if (L <= l && R >= r) {
  195. long long x = 0;
  196. for (int j = 60; j >= 0; j--) {
  197. if (tree[v].sum[j]) {
  198. x += st[j];
  199. }
  200. }
  201. return x;
  202. }
  203.  
  204. return get_or(v * 2, l, (l + r) / 2, L, R) |
  205. get_or(v * 2 + 1, (l + r) / 2 + 1, r, L, R);
  206. }
  207. long long get_xor(int v, int l, int r, int L, int R) {
  208. if (R < l || L > r) {
  209. return 0;
  210. }
  211. push(v);
  212. if (l >= L && r <= R) {
  213. long long x = 0;
  214. for (int j = 60; j >= 0; j--) {
  215. if (tree[v].sum[j] & 1) {
  216. x += st[j];
  217. }
  218. }
  219. return x;
  220. }
  221.  
  222. return get_xor(v * 2, l, (l + r) / 2, L, R) ^
  223. get_xor(v * 2 + 1, (l + r) / 2 + 1, r, L, R);
  224. }
  225.  
  226. long long get_x(int l, int r) {
  227. return get_xor(1, 1, N / 2, l, r);
  228. }
  229. long long get_o(int l, int r) {
  230. return get_or(1, 1, N / 2, l, r);
  231. }
  232. long long get_a(int l, int r) {
  233. return get_and(1, 1, N / 2, l, r);
  234. }
  235.  
  236. };
  237. SegTree t;
  238. string type, op;
  239. int l, r;
  240. long long x;
  241. int main()
  242. {
  243. st[0] = 1;
  244. ODIN = 1;
  245. for (int i = 1; i < 61; i++) {
  246. st[i] = st[i - 1] << 1;
  247. ODIN += st[i];
  248. }
  249. cin >> n >> q;
  250. for (int i = 0; i < n; i++) {
  251. cin >> a[i];
  252. b[i] = a[i];
  253. }
  254. t.init();
  255. for (int I = 0; I < q; I++) {
  256. cin >> type >> op;
  257. /*int tp = rand() % 2;
  258. if (tp == 0) {
  259. type = "upd";
  260. }
  261. else {
  262. type = "get";
  263. }
  264. int tp2 = rand() % 3;
  265. if (tp2 == 0) {
  266. op = "and";
  267. }
  268. if (tp2 == 1) {
  269. op = "or";
  270. }
  271. if(tp2 == 3){
  272. op = "xor";
  273. }*/
  274. if (type == "upd") {
  275. cin >> l >> r >> x;
  276. /*l = rand() % n + 1;
  277. r = rand() % n + 1;
  278. x = rand();
  279. if (r < l) {
  280. swap(l, r);
  281. }
  282. cout << type << " " << op << " " << l << " " << r << "\n";
  283. */
  284. if (op == "and") {
  285.  
  286. if (n <= 1000 && q <= 1000) {
  287. l--;
  288. r--;
  289. for (int i = l; i <= r; i++) {
  290. b[i] = b[i] & x;
  291. }
  292. }else t.ands(l, r, x);
  293. }
  294. if (op == "or") {
  295.  
  296. if (n <= 1000 && q <= 1000) {
  297. l--;
  298. r--;
  299. for (int i = l; i <= r; i++) {
  300. b[i] = b[i] | x;
  301. }
  302. }else t.ors(l, r, x);
  303. }
  304. if (op == "xor") {
  305.  
  306. if (n <= 1000 && q <= 1000) {
  307. l--;
  308. r--;
  309. for (int i = l; i <= r; i++) {
  310. b[i] = b[i] ^ x;
  311. }
  312. }else t.xors(l, r, x);
  313. }
  314. }
  315. else {
  316. /*l = rand() % n + 1;
  317. r = rand() % n + 1;
  318. if (r < l) {
  319. swap(l, r);
  320. }*/
  321. cin >> l >> r;
  322. if (op == "and") {
  323. long long a1 = t.get_a(l, r);
  324. if (n <= 1000 && q <= 1000) {
  325. l--;
  326. r--;
  327. long long ans = b[l];
  328. for (int i = l + 1; i <= r; i++) {
  329. ans = ans & b[i];
  330. }
  331. a1 = ans;
  332. }
  333. cout << a1 << "\n";
  334. }
  335. if (op == "or") {
  336. long long a1 = t.get_o(l, r);
  337. if (n <= 1000 && q <= 1000) {
  338. l--;
  339. r--;
  340. long long ans = b[l];
  341. for (int i = l + 1; i <= r; i++) {
  342. ans = ans | b[i];
  343. }
  344. a1 = ans;
  345. }
  346. cout << a1 << "\n";
  347. }
  348. if (op == "xor") {
  349. long long a1 = t.get_x(l, r);
  350. if (n <= 1000 && q <= 1000) {
  351. l--;
  352. r--;
  353. long long ans = b[l];
  354. for (int i = l + 1; i <= r; i++) {
  355. ans = ans ^ b[i];
  356. }
  357. a1 = ans;
  358. }
  359. cout << a1 << "\n";
  360. }
  361. }
  362. }
  363. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement