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;
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 {
int V[2 * SIZE], L[2 * SIZE], 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] += (e - s + 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];
}
int 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);
}
int 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 - 1));
xsp.eack(pii(r + 1, -1), pii(q, s - 1));
ysp.eack(pii(q, 1), pii(p, r - 1));
ysp.eack(pii(s + 1, -1), pii(p, r - 1));
}
sort(xsp.begin(), xsp.end());
sort(ysp.begin(), ysp.end());
vector<pair<int, pii> > E;
seg.sz = xx.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 - 1) == 0) {
E.eack(yy[vec[j + 1].ff] - yy[vec[j].ff], pii(vec[j].ss, vec[j + 1].ss));
}
}
}
seg.init();
seg.sz = yy.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 - 1) == 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 && W[k] + 1ll * k * a > W[k - 1] + 1ll * (k - 1) * a) --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 (stderr)
construction.cpp: In member function 'void ST::update(int, int, int, int, int, int)':
construction.cpp:44:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int m = ns + ne >> 1;
~~~^~~~
construction.cpp: In member function 'int ST::query(int, int, int, int, int)':
construction.cpp:53:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int m = ns + ne >> 1;
~~~^~~~
construction.cpp: In function 'int main()':
construction.cpp:88:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int ii = 0; ii < in.size(); ++ii) {
~~~^~~~~~~~~~~
construction.cpp:96: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:97: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:119:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int i = 0, si = 0; i < xx.size(); ++i) {
~~^~~~~~~~~~~
construction.cpp:120:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (; si < xsp.size() && xsp[si].ff.ff <= i; ++si) {
~~~^~~~~~~~~~~~
construction.cpp:125:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int j = 0; j + 1 < vec.size(); ++j) {
~~~~~~^~~~~~~~~~~~
construction.cpp:135:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int i = 0, si = 0; i < yy.size(); ++i) {
~~^~~~~~~~~~~
construction.cpp:136:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (; si < ysp.size() && ysp[si].ff.ff <= i; ++si) {
~~~^~~~~~~~~~~~
construction.cpp:141: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 |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |