Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <iostream>
- #include <iterator>
- #include <map>
- #include <set>
- #include <string>
- #include <vector>
- #include <algorithm>
- #include <stack>
- #include <deque>
- #include <queue>
- #include <climits>
- #define ll long long
- #define db double
- #define ff first
- #define ss second
- using namespace std;
- // const int MOD = 1e9 + 7;
- const int MOD = 1e9 + 9;
- const int INF = LONG_MAX;
- // const int INF = INT_MAX;
- const int P1 = 179;
- // const int P2 = 307;
- const int P2 = 257;
- struct Block {
- vector<int> count;
- int maxCount = 0;
- int l;
- int r; // включительно
- };
- int canBuy(int l, int r, vector<Block>& b, int len, int k) {
- int maxCount = 0;
- int cur = 0;
- int ind = l;
- int size = b.size();
- while (cur < size && b[cur].l < r) {
- if (b[cur].r < ind) {
- cur++;
- continue;
- }
- if (b[cur].l == ind) {
- if (b[cur].r <= r) {
- maxCount = max(maxCount, b[cur].maxCount);
- cur++;
- if (cur < size) {
- ind = b[cur].l;
- }
- } else {
- for (int i = ind; i < r; i++) { // убрал <=
- maxCount = max(maxCount, b[cur].count[i % len]);
- }
- cur++;
- }
- } else if (b[cur].r < r) {
- for (int i = ind; i <= b[cur].r; i++) {
- maxCount = max(maxCount, b[cur].count[i % len]);
- }
- cur++;
- if (cur < size) {
- ind = b[cur].l;
- }
- } else {
- for (int i = ind; i < r; i++) { // убрал <=
- maxCount = max(maxCount, b[cur].count[i % len]);
- }
- cur++;
- }
- }
- if (maxCount < k) {
- for (int i = l; i < r; i++) {
- int curAppend = i / len;
- /*if (curAppend == 1 && i % len == 3) {
- cout << "PLUS ONE" << '\n';
- }*/
- b[curAppend].count[i % len]++;
- if (b[curAppend].count[i % len] > b[curAppend].maxCount) {
- b[curAppend].maxCount = b[curAppend].count[i % len];
- }
- }
- return 1;
- } else {
- return 0;
- }
- }
- int stupidCheck(vector<int>& v, int l, int r, int k) {
- for (int i = l; i < r; i++) {
- if (v[i] >= k) {
- return 0;
- }
- }
- for (int i = l; i < r; i++) {
- v[i]++;
- }
- }
- signed main() {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- int n, k, m;
- cin >> n >> k >> m;
- /*if (n == 1) {
- cout << "HGBFVUIH:DH";
- return 0;
- }*/
- int len = sqrt(n + 1);
- int size = 0;
- if ((n + 1) % len == 0) {
- size = (n + 1) / len;
- } else {
- size = (n + 1) / len + 1;
- }
- vector<int> v(n + 1, 0);
- vector<Block> b(size);
- int cur = 0;
- int elemNum = 0;
- b[0].l = 0;
- for (int i = 0; i <= n; i++) {
- if (elemNum == len) {
- b[cur].r = i - 1;
- cur++;
- elemNum = 0;
- b[cur].l = i;
- }
- b[cur].count.push_back(0);
- elemNum++;
- }
- b[size - 1].r = n - 1;
- for (int i = 0; i < m; i++) {
- int l, r;
- cin >> l >> r;
- int norm = canBuy(l, r, b, len, k);
- cout << norm << '\n';
- // int stupid = stupidCheck(v, l, r, k);
- /*if (norm != stupid) {
- for (int j = 0; j <= n; j++) {
- if (v[j] != b[j / len].count[j % len]) {
- cout << "ERROR!!! j = " << j << " v[j] = " << v[j] << " b[" << j / len << "].count[" << j % len << "] = " << b[j / len].count[j % len] << '\n';
- }
- }
- } else {
- for (int j = 0; j <= n; j++) {
- if (v[j] != b[j / len].count[j % len]) {
- cout << "j = " << j << " v[j] = " << v[j] << " b[" << j / len << "].count[" << j % len << "] = " << b[j / len].count[j % len] << '\n';
- }
- }
- }*/
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement