#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> xVec, yVec;
struct xNode {
struct yNode {
ll globalSum, globalLazy;
ll totalSum, totalLazy;
yNode *lchild, *rchild;
yNode(){
globalSum = globalLazy = totalSum = totalLazy = 0;
lchild = rchild = nullptr;
}
~yNode(){
if(lchild) delete lchild;
if(rchild) delete rchild;
}
void update(int l, int r, int s, int e, ll bonus, ll len, bool same){
if(l==s && r==e){
if(same){
globalSum += 1 * (yVec[e] - yVec[s]);
globalLazy += 1;
}
totalSum += len * (yVec[e] - yVec[s]);
totalLazy += len;
return;
}
int m = (l+r)/2;
if(s<m){
if(!lchild) lchild = new yNode();
lchild->update(l, m, s, min(m, e), bonus, len, same);
}
if(m<e){
if(!rchild) rchild = new yNode();
rchild->update(m, r, max(s, m), e, bonus, len, same);
}
if(same){
globalSum = (lchild ? lchild->globalSum : 0) + (rchild ? rchild->globalSum : 0) + globalLazy * (yVec[r] - yVec[l]);
}
totalSum = (lchild ? lchild->totalSum : 0) + (rchild ? rchild->totalSum : 0) + totalLazy * (yVec[r] - yVec[l]);
}
};
yNode *tree;
xNode *lchild, *rchild;
xNode(){
tree = nullptr;
lchild = rchild = nullptr;
}
~xNode(){
if(tree) delete tree;
if(lchild) delete lchild;
if(rchild) delete rchild;
}
void update(int xl, int xr, int yl, int yr, int xs, int xe, int ys, int ye){
ll len = xVec[xe] - xVec[xs];
if(xl != xs || xr != xe){
int m = (xl+xr)/2;
if(xs < m){
if(!lchild) lchild = new xNode();
lchild->update(xl, m, yl, yr, xs, min(m, xe), ys, ye);
}
if(m < xe){
if(!rchild) rchild = new xNode();
rchild->update(m, xr, yl, yr, max(xs, m), xe, ys, ye);
}
}
if(!tree) tree = new yNode();
tree->update(yl, yr, ys, ye, xVec[xr] - xVec[xl], len, xl==xs && xr==xe);
}
} *tree;
ll query(xNode::yNode *i, int l, int r, int s, int e, ll lazySum, ll len, bool same){
ll ret = 0;
if(l==s && r==e){
if(same){
if(i) ret += i->totalSum;
ret += lazySum * (yVec[r] - yVec[l]);
}
else{
if(i) ret += i->globalSum * len;
ret += lazySum * len * (yVec[r] - yVec[l]);
}
return ret;
}
lazySum = !i ? lazySum : (lazySum + (same ? i->totalLazy : i->globalLazy));
int m = (l+r)/2;
if(s<m) ret += query(i ? i->lchild : nullptr, l, m, s, min(m, e), lazySum, len, same);
if(m<e) ret += query(i ? i->rchild : nullptr, m, r, max(s, m), e, lazySum, len, same);
return ret;
}
ll query(xNode *i, int xl, int xr, int yl, int yr, int xs, int xe, int ys, int ye){
ll len = xVec[xe] - xVec[xs];
ll ret = query(i->tree, yl, yr, ys, ye, 0, len, xl==xs && xr==xe);
if(xl!=xs || xr!=xe){
int m = (xl+xr)/2;
if(xs<m && i->lchild) ret += query(i->lchild, xl, m, yl, yr, xs, min(m, xe), ys, ye);
if(m<xe && i->rchild) ret += query(i->rchild, m, xr, yl, yr, max(xs, m), xe, ys, ye);
}
return ret;
}
int r, c, n, q, m, N, M;
ll _x1[50002], _y1[50002], _x2[50002], _y2[50002];
ll _qx1[50002], _qy1[50002], _qx2[50002], _qy2[50002], _qw[50002];
ll query(int xs, int xe, int ys, int ye){
return query(tree, 0, N-1, 0, M-1, xs, xe, ys, ye);
}
int main(){
scanf("%d %d %d %d %d", &r, &c, &n, &q, &m);
xVec.push_back(0), xVec.push_back(r);
yVec.push_back(0), yVec.push_back(c);
for(int i=1; i<=n; i++){
scanf("%lld %lld %lld %lld", &_x1[i], &_y1[i], &_x2[i], &_y2[i]);
if(_x1[i] > _x2[i]) swap(_x1[i], _x2[i]);
if(_y1[i] > _y2[i]) swap(_y1[i], _y2[i]);
xVec.push_back(_x1[i]), xVec.push_back(_x2[i]);
yVec.push_back(_y1[i]), yVec.push_back(_y2[i]);
}
for(int i=1; i<=q; i++){
scanf("%lld %lld %lld %lld %lld", &_qx1[i], &_qy1[i], &_qx2[i], &_qy2[i], &_qw[i]);
xVec.push_back(_qx1[i]), xVec.push_back(_qx2[i]);
yVec.push_back(_qy1[i]), yVec.push_back(_qy2[i]);
}
sort(xVec.begin(), xVec.end());
xVec.erase(unique(xVec.begin(), xVec.end()), xVec.end());
sort(yVec.begin(), yVec.end());
yVec.erase(unique(yVec.begin(), yVec.end()), yVec.end());
N = (int)xVec.size(), M = (int)yVec.size();
tree = new xNode();
for(int i=1; i<=n; i++){
_x1[i] = lower_bound(xVec.begin(), xVec.end(), _x1[i]) - xVec.begin();
_x2[i] = lower_bound(xVec.begin(), xVec.end(), _x2[i]) - xVec.begin();
_y1[i] = lower_bound(yVec.begin(), yVec.end(), _y1[i]) - yVec.begin();
_y2[i] = lower_bound(yVec.begin(), yVec.end(), _y2[i]) - yVec.begin();
tree->update(0, N-1, 0, M-1, _x1[i], _x2[i], _y1[i], _y2[i]);
}
ll ans = 0;
for(int i=1; i<=q; i++){
ll qx1 = _qx1[i], qy1 = _qy1[i], qx2 = _qx2[i], qy2 = _qy2[i], v = _qw[i];
ans %= m, v %= m;
qx1 = (qx1 + ans * v) % m;
qx2 = (qx2 + ans * v) % m;
qy1 = (qy1 + ans * v) % m;
qy2 = (qy2 + ans * v) % m;
if(qx1 > qx2) swap(qx1, qx2);
if(qy1 > qy2) swap(qy1, qy2);
int xl = upper_bound(xVec.begin(), xVec.end(), qx1) - xVec.begin() - 1;
int xr = lower_bound(xVec.begin(), xVec.end(), qx2) - xVec.begin();
int yl = upper_bound(yVec.begin(), yVec.end(), qy1) - yVec.begin() - 1;
int yr = lower_bound(yVec.begin(), yVec.end(), qy2) - yVec.begin();
ans = query(xl, xr, yl, yr);
printf("%lld\n", ans);
}
delete tree;
}
Compilation message
Main.cpp: In function 'int main()':
Main.cpp:122:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
122 | scanf("%d %d %d %d %d", &r, &c, &n, &q, &m);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:126:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
126 | scanf("%lld %lld %lld %lld", &_x1[i], &_y1[i], &_x2[i], &_y2[i]);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:133:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
133 | scanf("%lld %lld %lld %lld %lld", &_qx1[i], &_qy1[i], &_qx2[i], &_qy2[i], &_qw[i]);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
9 ms |
2696 KB |
Output is correct |
2 |
Correct |
9 ms |
2824 KB |
Output is correct |
3 |
Correct |
10 ms |
2636 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
9 ms |
2696 KB |
Output is correct |
2 |
Correct |
9 ms |
2824 KB |
Output is correct |
3 |
Correct |
10 ms |
2636 KB |
Output is correct |
4 |
Correct |
310 ms |
58860 KB |
Output is correct |
5 |
Correct |
244 ms |
40840 KB |
Output is correct |
6 |
Correct |
256 ms |
38172 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
9 ms |
2696 KB |
Output is correct |
2 |
Correct |
9 ms |
2824 KB |
Output is correct |
3 |
Correct |
10 ms |
2636 KB |
Output is correct |
4 |
Correct |
310 ms |
58860 KB |
Output is correct |
5 |
Correct |
244 ms |
40840 KB |
Output is correct |
6 |
Correct |
256 ms |
38172 KB |
Output is correct |
7 |
Correct |
2530 ms |
311128 KB |
Output is correct |
8 |
Runtime error |
2088 ms |
1048580 KB |
Execution killed with signal 9 |
9 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
9 ms |
2696 KB |
Output is correct |
2 |
Correct |
9 ms |
2824 KB |
Output is correct |
3 |
Correct |
10 ms |
2636 KB |
Output is correct |
4 |
Correct |
310 ms |
58860 KB |
Output is correct |
5 |
Correct |
244 ms |
40840 KB |
Output is correct |
6 |
Correct |
256 ms |
38172 KB |
Output is correct |
7 |
Correct |
3025 ms |
734812 KB |
Output is correct |
8 |
Runtime error |
1849 ms |
1048580 KB |
Execution killed with signal 9 |
9 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
9 ms |
2696 KB |
Output is correct |
2 |
Correct |
9 ms |
2824 KB |
Output is correct |
3 |
Correct |
10 ms |
2636 KB |
Output is correct |
4 |
Correct |
310 ms |
58860 KB |
Output is correct |
5 |
Correct |
244 ms |
40840 KB |
Output is correct |
6 |
Correct |
256 ms |
38172 KB |
Output is correct |
7 |
Correct |
2530 ms |
311128 KB |
Output is correct |
8 |
Runtime error |
2088 ms |
1048580 KB |
Execution killed with signal 9 |
9 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
1799 ms |
300288 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
1799 ms |
300288 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |