제출 #1305045

#제출 시각아이디문제언어결과실행 시간메모리
1305045GuilhermeKK원숭이와 사과 나무 (IZhO12_apple)C++20
100 / 100
498 ms260492 KiB
#include<bits/stdc++.h>
using namespace std;

#define int long long
const int MAXN = 1e9+10;

vector<int> seg, lz, e, d;

int create(){
    seg.push_back(0);
    lz.push_back(0);
    e.push_back(0);
    d.push_back(0);
    return seg.size()-1;
}

void refresh(int pos, int ini, int fim){
    if(lz[pos]==0) return;
    seg[pos] = fim-ini+1;
    if(ini<fim){
        if(e[pos]==0){ int aux = create(); e[pos] = aux; }
        if(d[pos]==0){ int aux = create(); d[pos] = aux; }
        lz[e[pos]] = lz[d[pos]] = 1;
    }
    lz[pos] = 0;
}

void update(int pos, int ini, int fim, int l, int r){
    refresh(pos, ini, fim);
    if(fim<l || r<ini) return;
    if(l<=ini && fim<=r){
        lz[pos] = 1;
        refresh(pos, ini, fim);
        return;
    }
    int m = (ini+fim)>>1;
    if(e[pos]==0){ int aux = create(); e[pos] = aux; }
    if(d[pos]==0){ int aux = create(); d[pos] = aux; }
    update(e[pos], ini, m, l, r);
    update(d[pos], m+1, fim, l, r);
    seg[pos] = seg[e[pos]] + seg[d[pos]];
}

int query(int pos, int ini, int fim, int l, int r){
    refresh(pos, ini, fim);
    if(fim<l || r<ini) return 0;
    if(l<=ini && fim<=r) return seg[pos];
    int m = (ini+fim)>>1;
    if(e[pos]==0){ int aux = create(); e[pos] = aux; }
    if(d[pos]==0){ int aux = create(); d[pos] = aux; }
    return query(e[pos], ini, m, l, r) + query(d[pos], m+1, fim, l, r);
}

int32_t main(){
    ios_base::sync_with_stdio(false); cin.tie(NULL);

    create(); create();

    int q; cin >> q;
    int c = 0;
    while(q--){
        int op, l, r; cin >> op >> l >> r;
        if(op==2) update(1, 1, MAXN, l+c, r+c);
        else{
            c = query(1, 1, MAXN, l+c, r+c);
            cout << c << "\n";
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...