제출 #1138111

#제출 시각아이디문제언어결과실행 시간메모리
1138111Hamed_Ghaffari원숭이와 사과 나무 (IZhO12_apple)C++20
100 / 100
390 ms199740 KiB
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

#define mid (l+r>>1)

const int MX=1e9;

struct seg {
  int ans;
  bool lz;
  seg *lc, *rc;
  seg(): ans(0), lz(0), lc(NULL), rc(NULL) {}
};

seg *root = new seg();

void pull(seg *v) {
  v->ans = 0;
  if(v->lc) v->ans += v->lc->ans;
  if(v->rc) v->ans += v->rc->ans;
}
void apply(int l, int r, seg *v) {
  v->ans = r-l; v->lz = 1;
}
void push(int l, int r, seg *v) {
  if(r-l==1) return;
  if(!v->lc) v->lc = new seg();
  if(!v->rc) v->rc = new seg();
  if(!v->lz) return;
  apply(l, mid, v->lc);
  apply(mid, r, v->rc);
  v->lz = 0;
}
void upd(int s, int e, int l=1, int r=MX+1, seg *v=root) {
  push(l, r, v);
  if(s<=l && r<=e) {
    apply(l, r, v);
    return;
  }
  if(s<mid) upd(s, e, l, mid, v->lc);
  if(e>mid) upd(s, e, mid, r, v->rc);
  pull(v);
}
int get(int s, int e, int l=1, int r=MX+1, seg *v=root) {
  push(l, r, v);
  if(s<=l && r<=e) return v->ans;
  int res=0;
  if(s<mid) res += get(s, e, l, mid, v->lc);
  if(e>mid) res += get(s, e, mid, r, v->rc);
  return res;
}

int32_t main() {
  cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
  int q;
  cin >> q;
  int c=0;
  while(q--) {
    int d, x, y;
    cin >> d >> x >> y;
    x += c; y += c+1;
    if(d==1) cout << (c=get(x,y)) << '\n';
    else upd(x, y);
  } 
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...