# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1037046 | pera | Monkey and Apple-trees (IZhO12_apple) | C++17 | 340 ms | 139608 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 || u == NULL){
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);
}
}
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |