Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // clang-format off
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <iomanip>
- #include <bitset>
- #include <vector>
- #include <algorithm>
- #include <random>
- #include <map>
- #include <string>
- #include <set>
- #include <deque>
- #include <cassert>
- const int N = 3e5 + 7, A = 26, C = 2, MOD = 998244353, bl = 350;
- const long long INF = 1e18;
- using namespace std;
- using ll = long long;
- using ld = long double;
- const ld EPS = 1e-9;
- int n, m;
- struct Block {
- bool snow[bl];
- int cnt[bl];
- int add_to_uncovered, add_to_covered, add_to_all;
- int full;
- void init() {
- for (int i = 0; i < bl; i++) {
- snow[i] = 0;
- cnt[i] = m;
- }
- full = -1; // 0 - не заполнять, 1 - заполнять снегом, -1 - заполнять отсутсвием снега
- add_to_uncovered = 0;
- add_to_covered = 0;
- add_to_all = 0;
- }
- void process() {
- for (int i = 0; i < bl; i++) {
- if (snow[i]) {
- cnt[i] += add_to_covered;
- }
- else {
- cnt[i] += add_to_uncovered;
- }
- cnt[i] += add_to_all;
- }
- add_to_covered = 0;
- add_to_uncovered = 0;
- add_to_all = 0;
- if (full == 0) {
- return;
- }
- if (full == -1) {
- for (int i = 0; i < bl; i++) {
- snow[i] = 0;
- }
- }
- else {
- for (int i = 0; i < bl; i++) {
- snow[i] = 1;
- }
- }
- full = 0;
- }
- void cover(int x) {
- if (full == -1) {
- add_to_all -= x;
- full = 1;
- return;
- }
- if (full == 1) {
- return;
- }
- full = 1;
- add_to_uncovered -= x;
- }
- void clear(int x) {
- if (full == -1) {
- return;
- }
- if (full == 1) {
- add_to_all += x;
- full = -1;
- return;
- }
- full = -1;
- add_to_covered += x;
- }
- void cover(int l, int r, int x) {
- process();
- for (int i = l; i <= r; i++) {
- if (!snow[i]) {
- cnt[i] -= x;
- snow[i] = 1;
- }
- }
- }
- void clear(int l, int r, int x) {
- process();
- for (int i = l; i <= r; i++) {
- if (snow[i]) {
- cnt[i] += x;
- snow[i] = 0;
- }
- }
- }
- };
- Block b[N / bl];
- void cover(int l, int r, int x) {
- int L = 0, R = bl - 1;
- for (int i = 0; i <= n / bl; i++) {
- int l1 = max(L, l);
- int r1 = min(r, R);
- if (r1 >= l1) {
- if (r1 - l1 + 1 == bl) {
- b[i].cover(x);
- }
- else {
- b[i].cover(l1 - L, r1 - L, x);
- }
- }
- L = R + 1;
- R = L + bl - 1;
- }
- }
- void clear(int l, int r, int x) {
- int L = 0, R = bl - 1;
- for (int i = 0; i <= n / bl; i++) {
- int l1 = max(L, l);
- int r1 = min(r, R);
- if (r1 >= l1) {
- if (r1 - l1 + 1 == bl) {
- b[i].clear(x);
- }
- else {
- b[i].clear(l1 - L, r1 - L, x);
- }
- }
- L = R + 1;
- R = L + bl - 1;
- }
- }
- signed main() {
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- #else
- std::ios::sync_with_stdio(false);
- cin.tie(0);
- #endif
- cin >> n >> m;
- for (int i = 0; i <= n / bl; i++) {
- b[i].init();
- }
- for (int i = 0; i < m; i++) {
- int cnt_days = m - i;
- char t;
- int l, r;
- cin >> t >> l >> r;
- l--;
- r--;
- if (t == '+') {
- cover(l, r, cnt_days);
- }
- else {
- clear(l, r, cnt_days);
- }
- }
- for (int i = 0; i <= n / bl; i++) {
- b[i].process();
- }
- for (int i = 0; i < n; i++) {
- cout << b[i / bl].cnt[i % bl] << " ";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement