Submission #1308839

#TimeUsernameProblemLanguageResultExecution timeMemory
1308839a5a7Monkey and Apple-trees (IZhO12_apple)C++20
100 / 100
270 ms137340 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

struct SparseNode{
    SparseNode *left = NULL, *right = NULL;
    int freq = 0;
    bool lazy = false;
    SparseNode() {};
};

void push_down(SparseNode *curr, int curr_left, int curr_right){
    if (!curr->left) curr->left = new SparseNode;
    if (!curr->right) curr->right = new SparseNode;
    int m = (curr_left+curr_right)/2;
    if (curr->lazy){
        curr->left->lazy = true;
        curr->right->lazy = true;
        curr->right->freq = (curr_right - m);
        curr->left->freq = (m - curr_left + 1);
    }
}

void paint(SparseNode *curr, int curr_left, int curr_right, int query_left, int query_right){
    if (curr_left > query_right || curr_right < query_left) return;
    if (query_left <= curr_left && curr_right <= query_right){
        curr->lazy = true;
        curr->freq = curr_right - curr_left+1;
        return;
    }
    push_down(curr, curr_left, curr_right);
    int m = (curr_left+curr_right)/2;
    paint(curr->left, curr_left, m, query_left, query_right);
    paint(curr->right, m+1, curr_right, query_left, query_right);
    curr->freq = curr->left->freq + curr->right->freq;
}

int sum(SparseNode *curr, int curr_left, int curr_right, int query_left, int query_right){
    if (curr_left > query_right || curr_right < query_left) return 0;
    if (query_left <= curr_left && curr_right <= query_right) {
        return curr->freq;
    }
    push_down(curr, curr_left, curr_right);
    int m = (curr_left+curr_right)/2;
    return sum(curr->left, curr_left, m, query_left, query_right) + sum(curr->right, m+1, curr_right, query_left, query_right);
}

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    int m; cin >> m;
    SparseNode *root = new SparseNode;
    int c = 0;
    while (m--){
        int d, x, y; cin >> d >> x >> y;
        if (d == 1){
            c = sum(root, 1, 1000000000, x+c, y+c);
            cout << c << "\n";
        }else{
            paint(root, 1, 1000000000, x+c, y+c);
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...