# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
989454 | Sunbae | 원숭이와 사과 나무 (IZhO12_apple) | C11 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <cstdio>
const int N = 1e5, M = 1e9;
int L, R, l[N<<2], r[N<<2], s[N<<2], lz[N<<2], ALLOC = 2;
void pg(int ind, int low, int high){
if(low != high){
if(!l[ind]) l[ind] = ALLOC++; if(!r[ind]) r[ind] = ALLOC++;
lz[l[ind]] = lz[r[ind]] = lz[ind];
}
lz[ind] = 0;
}
void upd(int ind, int low, int high){
if(lz[ind]){s[ind] = high-low+1; pg(ind, low, high); }
if(low > R || high < L) return;
if(L <= low && high <= R){s[ind] = high-low+1; lz[ind] = true; pg(ind, low, high); return;}
if(!l[ind]) l[ind] = ALLOC++; if(!r[ind]) r[ind] = ALLOC++;
int mid = low + ((high-low)>>1);
upd(l[ind], low, mid); upd(r[ind], mid+1, high);
s[ind] = ((l[ind])? s[l[ind]] : 0) + ((r[ind])? s[r[ind]] : 0);
}
int qry(int ind, int low, int high){
if(lz[ind]){s[ind] = high-low+1; pg(ind, low, high);}
if(low > R || high < L) return 0;
if(L <= low && high <= R) return s[ind];
int mid = low + ((high-low)>>1);
return ((l[ind])? qry(l[ind], low, mid) : 0) + ((r[ind])? qry(r[ind], mid+1, high) : 0);
}
signed main(){
int m, c = 0, d; scanf("%d", &m);
while(m--){
scanf("%d %d %d", &d, &L, &R); L += c; R += c;
if(d == 1) printf("%d\n", c = qry(1, 1, M));
else upd(1, 1, M);
}
}