제출 #148145

#제출 시각아이디문제언어결과실행 시간메모리
148145catalystgma원숭이와 사과 나무 (IZhO12_apple)C++11
100 / 100
840 ms233076 KiB
#include <bits/stdc++.h>
#define lll long long
#define ldb long double
#define pii pair<int,int>
#define pll pair<lll,lll>
#define pil pair<int,lll>
#define fi first
#define se second
#define vi vector<int>
#define pb push_back
#define sz(a) (int)(a).size()
#define all(a) begin(a),end(a)
#define inf (INT_MAX/2-1)
#define infl (1LL<<61)
#define y0 y5656
#define y1 y7878
#define aaa system("pause");
#define dbg(x) cerr<<(#x)<<": "<<(x)<<'\n',aaa
#define dbga(x,n) cerr<<(#x)<<"[]: ";for(int _=0;_<n;_++)cerr<<x[_]<<' ';cerr<<'\n',aaa
#define dbgs(x) cerr<<(#x)<<"[stl]: ";for(int _:x)cerr<<_<<' ';cerr<<'\n',aaa
#define maxv 1000000000

using namespace std;

struct nod {
  int ind, lson, rson, val, lazy;
  pii itv;
};

vector <nod> aint;
int ans;

void putlazy (int p) {
  if (aint[p].val == aint[p].itv.se - aint[p].itv.fi + 1) return;
  aint[p].lazy = 1;
}

void mkson (int p) {
  pii it = aint[p].itv; int na, mid = (it.fi + it.se) / 2;
  if (aint[p].lson == 0 && it.fi < it.se) {
    na = sz(aint); aint[p].lson = na;
    aint.pb({na, 0, 0, 0, 0, {it.fi, mid}});
  }
  if (aint[p].rson == 0 && it.fi < it.se) {
    na = sz(aint); aint[p].rson = na;
    aint.pb({na, 0, 0, 0, 0, {mid+1, it.se}});
  }
}

void update (int p, pii ok) {
  pii it = aint[p].itv;
  mkson (p);
  if (aint[p].lazy == 1) {
    if (it.fi < it.se) putlazy(aint[p].lson), putlazy(aint[p].rson);
    aint[p].lazy = 0; aint[p].val = it.se - it.fi + 1;
  }
  if (it.fi > ok.se || ok.fi > it.se) return;
  if (it.fi >= ok.fi && it.se <= ok.se) {
    if (it.fi < it.se) putlazy(aint[p].lson), putlazy(aint[p].rson);///!!!
    aint[p].val = it.se - it.fi + 1;
    return;
  }
  if (it.fi == it.se) return;
  update (aint[p].lson, ok);
  update (aint[p].rson, ok);
  aint[p].val = aint[aint[p].lson].val + aint[aint[p].rson].val;
}

int q;
void query (int p, pii ok) {
  pii it = aint[p].itv;
  mkson (p);
  if (aint[p].lazy == 1) {
    if (it.fi < it.se) putlazy(aint[p].lson), putlazy(aint[p].rson);
    aint[p].lazy = 0; aint[p].val = it.se - it.fi + 1;
  }
  if (it.fi > ok.se || ok.fi > it.se) return;
  if (it.fi >= ok.fi && it.se <= ok.se) { q += aint[p].val; return; }
  if (it.fi == it.se) return;
  query (aint[p].lson, ok);
  query (aint[p].rson, ok);
}

int prequery (pii ok) {
  q = 0;
  query (1, ok);
  return q;
}

int main () {
  ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
  int t; cin >> t;
  aint.pb(nod());
  aint.pb({1,0,0,0,0,{1,maxv}});
  int a, b, op;
  while (t--) {
    cin >> op >> a >> b;
    if (op == 1) {
      ans = prequery ({a+ans,b+ans});
      cout << ans << '\n';
    }
    else update (1, {a+ans, b+ans});
  }
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...