제출 #1125728

#제출 시각아이디문제언어결과실행 시간메모리
1125728jemin0619원숭이와 사과 나무 (IZhO12_apple)C++20
100 / 100
513 ms260420 KiB
#include <bits/stdc++.h>
using namespace std;
#define fastio cin.tie(NULL)->sync_with_stdio(false)

struct Node{
    Node*lp=NULL,*rp=NULL;
    int val=0, lazy=0;
};

struct DynamicSeg{
    Node*root = new Node();
    void prop(Node*node, int leftNode, int rightNode){
        if(node->lazy==0) return;
        if(leftNode!=rightNode){
            if(node->lp == NULL) node->lp = new Node();
            if(node->rp == NULL) node->rp = new Node();
            node->lp->lazy = 1;
            node->rp->lazy = 1;
        }
        node->val = rightNode-leftNode+1;
        node->lazy = 0;
    }
    void update_range(int left, int right, Node*node, int leftNode, int rightNode){
        prop(node, leftNode, rightNode);
        if(rightNode<left || right<leftNode) return;
        if(left<=leftNode && rightNode<=right){
            node->lazy = 1;
            prop(node, leftNode, rightNode);
            return;
        }
        int mid = (leftNode+rightNode)/2;
        if(node->lp == NULL) node->lp = new Node();
        if(node->rp == NULL) node->rp = new Node();
        update_range(left, right, node->lp, leftNode, mid);
        update_range(left, right, node->rp, mid+1, rightNode);
        node->val = node->lp->val + node->rp->val;
    }
    int query(int left, int right, Node*node, int leftNode, int rightNode){
        if(node==NULL) return 0;
        prop(node, leftNode, rightNode);
        if(rightNode<left || right<leftNode) return 0;
        if(left<=leftNode && rightNode<=right) return node->val;
        int mid = (leftNode+rightNode)/2;
        return query(left, right, node->lp, leftNode, mid) + query(left, right, node->rp, mid+1, rightNode);
    }
};

int main(){
    fastio;
    int M,C=0; cin>>M;
    DynamicSeg Dseg;
    while(M--){
        int q,l,r; cin>>q>>l>>r;
        if(q==1){
            int ans = Dseg.query(l+C, r+C, Dseg.root, 1, 1e9);
            cout<<ans<<'\n';
            C = ans;
        }
        else Dseg.update_range(l+C, r+C, Dseg.root, 1, 1e9);
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...