Advertisement
drof13

Untitled

May 10th, 2022
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.34 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <iostream>
  4. #include <iterator>
  5. #include <map>
  6. #include <set>
  7. #include <string>
  8. #include <vector>
  9. #include <algorithm>
  10. #include <stack>
  11. #include <deque>
  12. #include <queue>
  13. #include <climits>
  14.  
  15. #define ll long long
  16. #define db double
  17. #define ff first
  18. #define ss second
  19.  
  20. using namespace std;
  21.  
  22. // const int MOD = 1e9 + 7;
  23. const int MOD = 1e9 + 9;
  24. const int INF = LONG_MAX;
  25. // const int INF = INT_MAX;
  26. const int P1 = 179;
  27. // const int P2 = 307;
  28. const int P2 = 257;
  29.  
  30. struct Block {
  31.     vector<int> count;
  32.     int maxCount = 0;
  33.     int l;
  34.     int r;  // включительно
  35. };
  36.  
  37. int canBuy(int l, int r, vector<Block>& b, int len, int k) {
  38.     int maxCount = 0;
  39.     int cur = 0;
  40.     int ind = l;
  41.     int size = b.size();
  42.     while (cur < size && b[cur].l < r) {
  43.         if (b[cur].r < ind) {
  44.             cur++;
  45.             continue;
  46.         }
  47.         if (b[cur].l == ind) {
  48.             if (b[cur].r <= r) {
  49.                 maxCount = max(maxCount, b[cur].maxCount);
  50.                 cur++;
  51.                 if (cur < size) {
  52.                     ind = b[cur].l;
  53.                 }
  54.             } else {
  55.                 for (int i = ind; i < r; i++) {    // убрал <=
  56.                     maxCount = max(maxCount, b[cur].count[i % len]);
  57.                 }
  58.                 cur++;
  59.             }
  60.         } else if (b[cur].r < r) {
  61.             for (int i = ind; i <= b[cur].r; i++) {
  62.                 maxCount = max(maxCount, b[cur].count[i % len]);
  63.             }
  64.             cur++;
  65.             if (cur < size) {
  66.                 ind = b[cur].l;
  67.             }
  68.         } else {
  69.             for (int i = ind; i < r; i++) {      // убрал <=
  70.                 maxCount = max(maxCount, b[cur].count[i % len]);
  71.             }
  72.             cur++;
  73.         }
  74.     }
  75.     if (maxCount < k) {
  76.         for (int i = l; i < r; i++) {
  77.             int curAppend = i / len;
  78.             /*if (curAppend == 1 && i % len == 3) {
  79.                 cout << "PLUS ONE" << '\n';
  80.             }*/
  81.             b[curAppend].count[i % len]++;
  82.             if (b[curAppend].count[i % len] > b[curAppend].maxCount) {
  83.                 b[curAppend].maxCount = b[curAppend].count[i % len];
  84.             }
  85.         }
  86.         return 1;
  87.     } else {
  88.         return 0;
  89.     }
  90. }
  91.  
  92. int stupidCheck(vector<int>& v, int l, int r, int k) {
  93.     for (int i = l; i < r; i++) {
  94.         if (v[i] >= k) {
  95.             return 0;
  96.         }
  97.     }
  98.     for (int i = l; i < r; i++) {
  99.         v[i]++;
  100.     }
  101. }
  102.  
  103. signed main() {
  104.     ios_base::sync_with_stdio(0);
  105.     cin.tie(0);
  106.     cout.tie(0);
  107.     int n, k, m;
  108.     cin >> n >> k >> m;
  109.     /*if (n == 1) {
  110.         cout << "HGBFVUIH:DH";
  111.         return 0;
  112.     }*/
  113.     int len = sqrt(n + 1);
  114.     int size = 0;
  115.     if ((n + 1) % len == 0) {
  116.         size = (n + 1) / len;
  117.     } else {
  118.         size = (n + 1) / len + 1;
  119.     }
  120.     vector<int> v(n + 1, 0);
  121.     vector<Block> b(size);
  122.     int cur = 0;
  123.     int elemNum = 0;
  124.     b[0].l = 0;
  125.     for (int i = 0; i <= n; i++) {
  126.         if (elemNum == len) {
  127.             b[cur].r = i - 1;
  128.             cur++;
  129.             elemNum = 0;
  130.             b[cur].l = i;
  131.         }
  132.         b[cur].count.push_back(0);
  133.         elemNum++;
  134.     }
  135.     b[size - 1].r = n - 1;
  136.     for (int i = 0; i < m; i++) {
  137.         int l, r;
  138.         cin >> l >> r;
  139.         int norm = canBuy(l, r, b, len, k);
  140.         cout << norm << '\n';
  141.         // int stupid = stupidCheck(v, l, r, k);
  142.         /*if (norm != stupid) {
  143.             for (int j = 0; j <= n; j++) {
  144.                 if (v[j] != b[j / len].count[j % len]) {
  145.                     cout << "ERROR!!!  j = " << j << " v[j] = " << v[j] << "  b[" << j / len << "].count[" << j % len << "] = " << b[j / len].count[j % len] << '\n';
  146.                 }
  147.             }
  148.         } else {
  149.             for (int j = 0; j <= n; j++) {
  150.                 if (v[j] != b[j / len].count[j % len]) {
  151.                     cout << "j = " << j << " v[j] = " << v[j] << "  b[" << j / len << "].count[" << j % len << "] = " << b[j / len].count[j % len] << '\n';
  152.                 }
  153.             }
  154.         }*/
  155.     }
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement