#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
int n;
struct Node{
int l, r, sum, lazy;
Node *leftChild, *rightChild;
Node(int ql, int qr){
l = ql; r = qr;
sum = lazy = 0;
leftChild = rightChild = nullptr;
}
} *root;
struct SegmentTree{
void pass(Node *currNode){
int l = (currNode -> l), r = (currNode -> r);
if (currNode -> lazy == 0) return;
if (l == r) return;
int mid = (l + r) / 2;
if (currNode -> leftChild == nullptr) currNode -> leftChild = new Node(l, mid);
if (currNode -> rightChild == nullptr) currNode -> rightChild = new Node(mid + 1, r);
Node *leftChild = currNode -> leftChild;
Node *rightChild = currNode -> rightChild;
(leftChild -> l) = l; (leftChild -> r) = mid;
(rightChild -> l) = mid + 1; (rightChild -> r) = r;
(leftChild -> sum) = (leftChild -> lazy) = mid - l + 1;
(rightChild -> sum) = (rightChild -> lazy) = r - mid;
}
void update(int ql, int qr, Node *currNode = root){
int l = (currNode -> l), r = (currNode -> r);
if ((qr < l) || (r < ql)) return;
if ((ql <= l) && (r <= qr)){
(currNode -> sum) = (currNode -> lazy) = r - l + 1;
return;
}
int mid = (l + r) / 2;
pass(currNode);
if (currNode -> leftChild == nullptr) currNode -> leftChild = new Node(l, mid);
if (currNode -> rightChild == nullptr) currNode -> rightChild = new Node(mid + 1, r);
update(ql, qr, currNode -> leftChild);
update(ql, qr, currNode -> rightChild);
(currNode -> sum) = (currNode -> leftChild -> sum) + (currNode -> rightChild -> sum);
}
int query(int ql, int qr, Node *currNode = root){
int l = (currNode -> l), r = (currNode -> r);
if ((qr < l) || (r < ql)) return 0;
if ((ql <= l) && (r <= qr)) return (currNode -> sum);
pass(currNode);
int lhs = 0, rhs = 0;
if (currNode -> leftChild != nullptr) lhs = query(ql, qr, currNode -> leftChild);
if (currNode -> rightChild != nullptr) rhs = query(ql, qr, currNode -> rightChild);
return lhs + rhs;
}
} tree;
signed main(){
cin.tie(0) -> sync_with_stdio(0);
if (fopen("task.inp","r")){
freopen("task.inp","r", stdin);
freopen("task.out","w", stdout);
}
#define FILENAME "mpoints"
if (fopen(FILENAME".inp","r")){
freopen(FILENAME".inp","r",stdin);
freopen(FILENAME".out","w",stdout);
}
int q, tau = 1;
cin >> q;
root = new Node(1, n);
n = 1'000'000'000;
int c = 0;
while (q--){
int d, x, y;
cin >> d >> x >> y;
int l = x + tau * c, r = y + tau * c;
if (d == 1){
c = tree.query(l, r);
cout << c << endl;
}
else tree.update(l, r);
}
}
Compilation message (stderr)
apple.cpp: In function 'int main()':
apple.cpp:76:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
76 | freopen("task.inp","r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
apple.cpp:77:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
77 | freopen("task.out","w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
apple.cpp:81:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
81 | freopen(FILENAME".inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
apple.cpp:82:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
82 | freopen(FILENAME".out","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |