제출 #515841

#제출 시각아이디문제언어결과실행 시간메모리
515841MohamedFaresNebili원숭이와 사과 나무 (IZhO12_apple)C++14
100 / 100
426 ms208864 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using ii = pair<ll, ll>; using vi = vector<int>; #define ff first #define ss second #define pb push_back #define all(x) x.begin(), x.end() #define lb lower_bound #define ub upper_bound struct seg{ struct node{ node *l = nullptr, *r = nullptr; int data = 0; bool lazy = false; }; node *root = new node(); void prop(node *v, int l, int r) { if(!v -> l) v -> l = new node(); if(!v -> r) v -> r = new node(); int md =(l + r) / 2; v -> l -> data = md - l + 1; v -> r -> data = r - md; v -> lazy = false; v -> l -> lazy = v ->r -> lazy = true; } void update(node *v, int l, int r, int lo, int hi) { if(l > hi || r < lo) return; if(v -> lazy) prop(v, l, r); if(l >= lo && r <= hi) { v -> data = r - l + 1; v -> lazy = true; prop(v, l, r); return; } int md = (l + r) / 2; if(!v -> l) v -> l = new node(); if(!v -> r) v -> r = new node(); update(v -> l, l, md, lo, hi); update(v -> r, md + 1, r, lo, hi); v -> data = v -> l -> data + v -> r -> data; } int query(node *v, int l, int r, int lo, int hi) { if(l > hi || r < lo) return 0; if(v -> lazy) prop(v, l, r); if(l >= lo && r <= hi) return v -> data; int md = (l + r) / 2; if(!v -> l) v -> l = new node(); if(!v -> r) v -> r = new node(); return query(v -> l, l, md, lo, hi) + query(v -> r, md + 1, r, lo, hi); } void update(int lo, int hi) { update(root, 0, 1000000007, lo, hi); } int query(int lo, int hi) { return query(root, 0, 1000000007, lo, hi); } }; int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int q; cin >> q; int c = 0; seg st; while(q--) { int d, l, r; cin >> d >> l >> r; l += c; r += c; if(d == 1) { c = st.query(l, r); cout << c << "\n"; } else st.update(l, r); } }
#Verdict Execution timeMemoryGrader output
Fetching results...