TrickmanOff

Untitled

Aug 16th, 2019
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.03 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <functional>
  6. #include <string>
  7. #include <queue>
  8. #include <time.h>
  9. #include <random>
  10. #include <cstring>
  11. #include <cmath>
  12. #include <bitset>
  13. #include <deque>
  14. #include <set>
  15.  
  16. using namespace std;
  17.  
  18. #define fast cin.tie(0);cout.tie(0);cin.sync_with_stdio(0);cout.sync_with_stdio(0);
  19. #define cin in
  20. //#define cout out
  21. #define pii pair<int,int>
  22. #define ll long long
  23. #define db double
  24.  
  25. //ifstream in("sum.in");
  26. //ofstream out("sum.out");
  27.  
  28. ifstream in("input.txt");
  29. ofstream out("output.txt");
  30.  
  31. const int MAXN = 1e5, SIZE = 262144;
  32. ll tree[SIZE];
  33. int push[SIZE];
  34.  
  35. void push_v(int v, int lb, int rb) {
  36.     int cur = push[v];
  37.  
  38.     if (cur != 0) {
  39.         push[v] = 0;
  40.         int mid = (lb + rb) / 2;
  41.         tree[2 * v] = (ll)(mid - lb + 1) * cur;
  42.         tree[2 * v + 1] = (ll)(rb - mid) * cur;
  43.  
  44.         push[2 * v] = push[2 * v + 1] = cur;
  45.     }
  46. }
  47.  
  48. void upd(int v, int l, int r, int val, int lb, int rb) {
  49.     if (lb > r || rb < l)
  50.         return;
  51.  
  52.     if (l == lb && r == rb) {
  53.         push[v] = val;
  54.         tree[v] = (ll)(rb - lb + 1) * val;
  55.         return;
  56.     }
  57.  
  58.     push_v(v, lb, rb);
  59.     int mid = (lb + rb) / 2;
  60.     upd(2 * v, l, min(r, mid), val, lb, mid);
  61.     upd(2 * v + 1, max(mid + 1, l), r, val, mid + 1, rb);
  62.  
  63.     tree[v] = tree[2 * v] + tree[2 * v + 1];
  64. }
  65.  
  66. void upd(int l, int r, int val) {
  67.     upd(1, l, r, val, 1, MAXN);
  68. }
  69.  
  70. ll get_sum(int v, int l, int r, int lb, int rb) {
  71.     if (lb > r || rb < l)
  72.         return 0;
  73.  
  74.     if (lb == l && rb == r)
  75.         return tree[v];
  76.  
  77.     push_v(v, lb, rb);
  78.  
  79.     int mid = (lb + rb) / 2;
  80.     return get_sum(2 * v, l, min(mid, r), lb, mid) +
  81.         get_sum(2 * v + 1, max(mid + 1, l), r, mid + 1, rb);
  82. }
  83.  
  84. ll get_sum(int l, int r) {
  85.     return get_sum(1, l, r, 1, MAXN);
  86. }
  87.  
  88. void solve() {
  89.     int n, k;
  90.     cin >> n >> k;
  91.  
  92.     while (k--) {
  93.         char c;
  94.         cin >> c;
  95.         if (c == 'A') {
  96.             int l, r, x;
  97.             cin >> l >> r >> x;
  98.             upd(l, r, x);
  99.         }
  100.         else {
  101.             int l, r;
  102.             cin >> l >> r;
  103.             cout << get_sum(l, r) << ' ';
  104.         }
  105.     }
  106. }
  107.  
  108. int nums[30];
  109.  
  110. void upd2(int l, int r, int val) {
  111.     for (; l <= r; l++) {
  112.         nums[l] = val;
  113.     }
  114. }
  115.  
  116. ll get_ans(int l, int r) {
  117.     ll sum = 0;
  118.     for (; l <= r; l++)
  119.         sum += (ll)nums[l];
  120.     return sum;
  121. }
  122.  
  123.  
  124. void gen() {
  125.     int n = rand() % 10 + 1;
  126.     int k = rand() % 10 + 1;
  127.  
  128.  
  129.     for (int i = 0; i < k; i++) {
  130.         int c = rand() % 2;
  131.         if (c) {
  132.             int l = rand() % n + 1;
  133.             int r = (rand() % (n - l + 1)) + l;
  134.             int val = rand() % 10;
  135.  
  136.             cout << "A " << l << ' ' << r << ' ' << val << '\n';
  137.             upd(l, r, val);
  138.             upd2(l, r, val);
  139.         }
  140.  
  141.         else {
  142.             int l = rand() % n + 1;
  143.             int r = (rand() % (n - l + 1)) + l;
  144.  
  145.             cout << "Q " << l << ' ' << r << '\n';
  146.  
  147.             ll right = get_ans(l, r);
  148.             ll my = get_sum(l, r);
  149.             if (my != right) {
  150.                 cout << "\nmy = " << my << " right = " << right;
  151.                 exit(0);
  152.             }
  153.         }
  154.     }
  155.  
  156. }
  157.  
  158. void clr() {
  159.     memset(push, 0, sizeof(push));
  160.     memset(tree, 0, sizeof(tree));
  161.     memset(nums, 0, sizeof(nums));
  162.     system("cls");
  163. }
  164.  
  165. int main()
  166. {
  167.     srand(time(0));
  168.     int k = 100000;
  169.     while (k--) {
  170.         gen();
  171.         clr();
  172.     }
  173. }
Advertisement
Add Comment
Please, Sign In to add comment