#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 ((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);
freopen("f.in","r", stdin);
freopen("f.out","w", stdout);
int q, tau;
cin >> n >> q >> tau;
root = new Node(1, n);
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);
}
}
컴파일 시 표준 에러 (stderr) 메시지
apple.cpp: In function 'int main()':
apple.cpp:74:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
74 | freopen("f.in","r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~
apple.cpp:75:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
75 | freopen("f.out","w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |