Submission #1125728

#TimeUsernameProblemLanguageResultExecution timeMemory
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...