# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1037044 | pera | 원숭이와 사과 나무 (IZhO12_apple) | C++17 | 0 ms | 348 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
const int N = 1e9;
int Q;
struct node{
node *left , *right;
int sum = 0 , lz = -1;
node(int x = 0) : sum(x) , lz(0) , left(NULL) , right(NULL){}
} *root;
void push(node *&u , int l , int r){
if(u->lz == -1){
return;
}
if(u->left == NULL){
u->left = new node();
}
if(u->right == NULL){
u->right = new node();
}
int m = (l + r) / 2;
u->left->sum = (m - l + 1) * u->lz;
u->right->sum = (r - m) * u->lz;
u->left->lz = u->lz;
u->right->lz = u->lz;
u->lz = -1;
}
void upd(node *&u , int l , int r , int L , int R , int x){
if(l > r || r < L || l > R){
return;
}
if(u == NULL){
u = new node();
}
if(L <= l && r <= R){
u->sum = x * (r - l + 1);
u->lz = x;
return;
}
push(u , l , r);
int m = (l + r) / 2;
upd(u->left , l , m , L , R , x);
upd(u->right , m + 1 , r , L , R , x);
u->sum = 0;
if(u->left){
u->sum += u->left->sum;
}
if(u->right){
u->sum += u->right->sum;
}
}
int get(node *&u , int l , int r , int L , int R){
if(l > r || r < L || l > R){
return 0;
}
if(L <= l && r <= R){
return u->sum;
}
push(u , l , r);
int m = (l + r) / 2;
return get(u->left , l , m , L , R) + get(u->right , m + 1 , r , L , R);
}
int main(){
int C = 0;
cin >> Q;
while(Q--){
int D , X , Y;
cin >> D >> X >> Y;
X += C;
Y += C;
if(D == 1){
C = get(root , 1 , N , X , Y);
cout << C << " ";
}else{
upd(root , 1 , N , X , Y , 1);
}
}
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |