| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 630220 | zhangjishen | 원숭이와 사과 나무 (IZhO12_apple) | C++98 | 329 ms | 105304 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
const int N = 1e9, MAXQ = 1e5 + 10;
// explicit segment tree
struct Node{
int l, r;
int sum, tag;
int ls, rs;
}t[MAXQ * 30 * 4];
int tot, root;
int newn(int l, int r){ // allocate memory for node [l, r]
++tot;
t[tot].l = l; t[tot].r = r;
t[tot].sum = t[tot].tag = 0;
t[tot].ls = t[tot].rs = 0;
return tot;
}
void pushup(int u){
t[u].sum = t[t[u].ls].sum + t[t[u].rs].sum;
}
void pushdown(int u){
if(t[u].tag){
int mid = (t[u].l + t[u].r) / 2;
if(!t[u].ls) t[u].ls = newn(t[u].l, mid);
t[t[u].ls].sum = mid - t[u].l + 1;
t[t[u].ls].tag = 1;
if(!t[u].rs) t[u].rs = newn(mid + 1, t[u].r);
t[t[u].rs].sum = t[u].r - mid;
t[t[u].rs].tag = 1;
t[u].tag = 0;
}
}
void update(int u, int ul, int ur){ // cover [ul, ur] in [l, r] with 1
if(t[u].l == ul && t[u].r == ur){
t[u].sum = (t[u].r - t[u].l + 1);
t[u].tag = 1;
return;
}
int mid = (t[u].l + t[u].r) / 2;
pushdown(u);
if(ul <= mid){
if(!t[u].ls) t[u].ls = newn(t[u].l, mid);
update(t[u].ls, ul, min(ur, mid));
}
if(ur >= mid + 1){
if(!t[u].rs) t[u].rs = newn(mid + 1, t[u].r);
update(t[u].rs, max(ul, mid + 1), ur);
}
pushup(u);
}
int query(int u, int ql, int qr){ // query sum of [ql, qr] in [l, r]
if(t[u].l == ql && t[u].r == qr)
return t[u].sum;
int mid = (t[u].l + t[u].r) / 2, L = 0, R = 0;
pushdown(u);
if(ql <= mid && t[u].ls)
L = query(t[u].ls, ql, min(qr, mid));
if(qr >= mid + 1 && t[u].rs)
R = query(t[u].rs, max(ql, mid + 1), qr);
return L + R;
}
int m;
int main(){
// biuld segment tree
tot = 0;
root = newn(1, N);
// operations
scanf("%d", &m);
int op, l, r, c = 0;
for(int i = 1; i <= m; i++){
scanf("%d %d %d", &op, &l, &r);
l += c; r += c;
if(op == 1){
c = query(root, l, r);
printf("%d\n", c);
}else update(root, l, r);
}
}
컴파일 시 표준 에러 (stderr) 메시지
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
