#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
#define ff first
#define ss second
#define eack emplace_back
#define pack push_back
vector<int> xx, yy;
vector<pii> in, xnode[600005], ynode[600005];
vector<pair<pii, pii> > in2, xsp, ysp;
long long W[200005];
int upa[200005];
int fnd(int x) {return upa[x] == x ? x : upa[x] = fnd(upa[x]);}
bool uni(int x, int y) {
x = fnd(x), y = fnd(y);
if (x == y) return 0;
upa[y] = x;
return 1;
}
const int SIZE = 1 << 20;
struct ST {
long long V[2 * SIZE], L[2 * SIZE];
int sz;
void init() {
memset(V, 0, sizeof(V));
memset(L, 0, sizeof(L));
}
void Ldown(int nn, int s, int m, int e) {
L[nn << 1] += L[nn];
L[nn << 1 | 1] += L[nn];
V[nn << 1] += L[nn] * (m - s + 1);
V[nn << 1 | 1] += L[nn] * (e - m);
L[nn] = 0;
}
void update(int s, int e, int v, int nn, int ns, int ne) {
if (ns > e || ne < s) return;
if (s <= ns && ne <= e) {
V[nn] += (ne - ns + 1) * v;
L[nn] += v;
return;
}
int m = ns + ne >> 1;
Ldown(nn, ns, m, ne);
update(s, e, v, nn << 1, ns, m);
update(s, e, v, nn << 1 | 1, m + 1, ne);
V[nn] = V[nn << 1] + V[nn << 1 | 1];
}
long long query(int s, int e, int nn, int ns, int ne) {
if (ns > e || ne < s) return 0;
if (s <= ns && ne <= e) return V[nn];
int m = ns + ne >> 1;
Ldown(nn, ns, m, ne);
return query(s, e, nn << 1, ns, m) + query(s, e, nn << 1 | 1, m + 1, ne);
}
void update(int s, int e, int v) {
update(s, e, v, 1, 0, sz);
}
long long query(int s, int e) {
return query(s, e, 1, 0, sz);
}
} seg;
int main() {
ios_base::sync_with_stdio(0), cin.tie(0);
int N, M, C; cin >> N >> M >> C;
for (int i = 0; i < N; ++i) {
int x, y; cin >> x >> y;
xx.eack(x);
yy.eack(y);
in.eack(x, y);
}
for (int i = 0; i < M; ++i) {
int p, q, r, s; cin >> p >> q >> r >> s;
xx.eack(p); xx.eack(r);
yy.eack(q); yy.eack(s);
in2.eack(pii(p, q), pii(r, s));
}
sort(xx.begin(), xx.end());
sort(yy.begin(), yy.end());
xx.erase(unique(xx.begin(), xx.end()), xx.end());
yy.erase(unique(yy.begin(), yy.end()), yy.end());
iota(upa, upa + N, 0);
for (int ii = 0; ii < in.size(); ++ii) {
auto i = in[ii];
i.ff = lower_bound(xx.begin(), xx.end(), i.ff) - xx.begin();
i.ss = lower_bound(yy.begin(), yy.end(), i.ss) - yy.begin();
xnode[i.ff].eack(i.ss, ii);
ynode[i.ss].eack(i.ff, ii);
}
for (int i = 0; i < xx.size(); ++i) sort(xnode[i].begin(), xnode[i].end());
for (int i = 0; i < yy.size(); ++i) sort(ynode[i].begin(), ynode[i].end());
for (auto i : in2) {
int p, q, r, s;
tie(p, q) = i.ff;
tie(r, s) = i.ss;
p = lower_bound(xx.begin(), xx.end(), p) - xx.begin();
r = lower_bound(xx.begin(), xx.end(), r) - xx.begin();
q = lower_bound(yy.begin(), yy.end(), q) - yy.begin();
s = lower_bound(yy.begin(), yy.end(), s) - yy.begin();
xsp.eack(pii(p, 1), pii(q, s));
xsp.eack(pii(r + 1, -1), pii(q, s));
ysp.eack(pii(q, 1), pii(p, r));
ysp.eack(pii(s + 1, -1), pii(p, r));
}
sort(xsp.begin(), xsp.end());
sort(ysp.begin(), ysp.end());
vector<pair<int, pii> > E;
seg.sz = (int)yy.size() - 1;
for (int i = 0, si = 0; i < xx.size(); ++i) {
for (; si < xsp.size() && xsp[si].ff.ff <= i; ++si) {
seg.update(xsp[si].ss.ff, xsp[si].ss.ss, xsp[si].ff.ss);
}
auto &vec = xnode[i];
for (int j = 0; j + 1 < vec.size(); ++j) {
if (seg.query(vec[j].ff, vec[j + 1].ff) == 0) {
E.eack(yy[vec[j + 1].ff] - yy[vec[j].ff], pii(vec[j].ss, vec[j + 1].ss));
}
}
}
seg.init();
seg.sz = (int)xx.size() - 1;
for (int i = 0, si = 0; i < yy.size(); ++i) {
for (; si < ysp.size() && ysp[si].ff.ff <= i; ++si) {
seg.update(ysp[si].ss.ff, ysp[si].ss.ss, ysp[si].ff.ss);
}
auto &vec = ynode[i];
for (int j = 0; j + 1 < vec.size(); ++j) {
if (seg.query(vec[j].ff, vec[j + 1].ff) == 0) {
E.eack(xx[vec[j + 1].ff] - xx[vec[j].ff], pii(vec[j].ss, vec[j + 1].ss));
}
}
}
sort(E.begin(), E.end());
int K = N;
for (auto i : E) {
if (uni(i.ss.ff, i.ss.ss)) {
--K;
W[K] = W[K + 1] + i.ff;
}
}
vector<pair<pii, int> > qry(C);
vector<long long> ans(C);
for (int i = 0; i < C; ++i) {
int a, b; cin >> a >> b;
qry[i] = {pii(a, b), i};
}
sort(qry.begin(), qry.end());
for (int i = 0, k = N; i < C; ++i) {
if (qry[i].ff.ss < K) {
ans[qry[i].ss] = -1;
continue;
}
int a, b; tie(a, b) = qry[i].ff;
while (k > K && a >= W[k - 1] - W[k]) --k;
ans[qry[i].ss] = W[min(b, k)] + 1ll * min(b, k) * a;
}
for (auto i : ans) cout << i << '\n';
return 0;
}
Compilation message
construction.cpp: In member function 'void ST::update(int, int, int, int, int, int)':
construction.cpp:45:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int m = ns + ne >> 1;
~~~^~~~
construction.cpp: In member function 'long long int ST::query(int, int, int, int, int)':
construction.cpp:54:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int m = ns + ne >> 1;
~~~^~~~
construction.cpp: In function 'int main()':
construction.cpp:89:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int ii = 0; ii < in.size(); ++ii) {
~~~^~~~~~~~~~~
construction.cpp:97:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int i = 0; i < xx.size(); ++i) sort(xnode[i].begin(), xnode[i].end());
~~^~~~~~~~~~~
construction.cpp:98:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int i = 0; i < yy.size(); ++i) sort(ynode[i].begin(), ynode[i].end());
~~^~~~~~~~~~~
construction.cpp:120:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int i = 0, si = 0; i < xx.size(); ++i) {
~~^~~~~~~~~~~
construction.cpp:121:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (; si < xsp.size() && xsp[si].ff.ff <= i; ++si) {
~~~^~~~~~~~~~~~
construction.cpp:126:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int j = 0; j + 1 < vec.size(); ++j) {
~~~~~~^~~~~~~~~~~~
construction.cpp:136:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int i = 0, si = 0; i < yy.size(); ++i) {
~~^~~~~~~~~~~
construction.cpp:137:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (; si < ysp.size() && ysp[si].ff.ff <= i; ++si) {
~~~^~~~~~~~~~~~
construction.cpp:142:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int j = 0; j + 1 < vec.size(); ++j) {
~~~~~~^~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
84 ms |
62836 KB |
Output is correct |
2 |
Correct |
461 ms |
80568 KB |
Output is correct |
3 |
Correct |
511 ms |
80560 KB |
Output is correct |
4 |
Correct |
398 ms |
79796 KB |
Output is correct |
5 |
Correct |
577 ms |
82440 KB |
Output is correct |
6 |
Correct |
508 ms |
80844 KB |
Output is correct |
7 |
Correct |
240 ms |
79824 KB |
Output is correct |
8 |
Correct |
336 ms |
82508 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1760 ms |
103804 KB |
Output is correct |
2 |
Correct |
1918 ms |
96388 KB |
Output is correct |
3 |
Correct |
1841 ms |
96496 KB |
Output is correct |
4 |
Correct |
1806 ms |
96292 KB |
Output is correct |
5 |
Correct |
917 ms |
101868 KB |
Output is correct |
6 |
Correct |
502 ms |
82552 KB |
Output is correct |
7 |
Correct |
1782 ms |
96012 KB |
Output is correct |
8 |
Correct |
685 ms |
104656 KB |
Output is correct |
9 |
Correct |
672 ms |
104620 KB |
Output is correct |
10 |
Correct |
814 ms |
99356 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
743 ms |
106272 KB |
Output is correct |
2 |
Correct |
778 ms |
104520 KB |
Output is correct |
3 |
Correct |
736 ms |
102296 KB |
Output is correct |
4 |
Correct |
635 ms |
99152 KB |
Output is correct |
5 |
Correct |
670 ms |
95188 KB |
Output is correct |
6 |
Correct |
768 ms |
101708 KB |
Output is correct |
7 |
Correct |
715 ms |
99668 KB |
Output is correct |
8 |
Correct |
805 ms |
99156 KB |
Output is correct |
9 |
Correct |
474 ms |
97552 KB |
Output is correct |
10 |
Correct |
566 ms |
99412 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2017 ms |
113032 KB |
Output is correct |
2 |
Correct |
1279 ms |
101148 KB |
Output is correct |
3 |
Correct |
2193 ms |
105176 KB |
Output is correct |
4 |
Correct |
690 ms |
89808 KB |
Output is correct |
5 |
Correct |
1981 ms |
105232 KB |
Output is correct |
6 |
Correct |
736 ms |
90044 KB |
Output is correct |
7 |
Correct |
1940 ms |
109796 KB |
Output is correct |
8 |
Correct |
2083 ms |
110364 KB |
Output is correct |
9 |
Correct |
931 ms |
112844 KB |
Output is correct |
10 |
Correct |
1014 ms |
111220 KB |
Output is correct |
11 |
Correct |
599 ms |
98048 KB |
Output is correct |