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;
typedef long long ll;
typedef pair <ll, ll> pll;
struct vec{
ll x, y;
vec() {}
vec(ll x, ll y) : x(x), y(y) {}
vec operator - (vec &v) { return vec(x - v.x, y - v.y); }
ll operator * (vec &v) { return x * v.y - y * v.x; }
};
struct query{
ll x, l, r, i;
query() {}
query(ll x, ll l, ll r, ll i) :
x(x), l(l), r(r), i(i) {}
};
struct fenwick{
ll T[101010];
void addval(ll p, ll v) { for(; p<=1e5; p+=p&-p) T[p] += v; }
ll getval(ll p) { return p? getval(p - (p & -p)) + T[p] : 0; }
ll getval(ll l, ll r) { return getval(r) - getval(l - 1); }
};
fenwick T;
vector <pll> Q1[30303], Q2[30303];
vector <ll> G[30303], V;
vector <query> K;
vec P[30303];
ll X[101010], Y[101010], A[101010];
ll n, m, q;
void sort(ll f, ll *X)
{
ll i;
V.clear();
if(!f) V.push_back(3), V.push_back(2);
else V.push_back(1), V.push_back(0);
for(i=4; i<n+n; i++){
V.push_back(i);
}
vec vd = P[f] - P[f ^ 1];
sort(V.begin() + 1, V.end(), [&](ll &a, ll &b){
vec va = (a & 1? P[f] - P[a >> 1] : P[a >> 1] - P[f]);
vec vb = (b & 1? P[f] - P[b >> 1] : P[b >> 1] - P[f]);
bool fa = vd * va > 0;
bool fb = vd * vb > 0;
if(fa != fb) return fa;
else return va * vb > 0;
});
for(i=0; i<V.size(); i++){
X[V[i]] = i + 1;
}
}
void solve(ll f, ll p)
{
vector <pll> &Q = (!f? Q1[p] : Q2[p]);
ll i, j;
ll l11, l12, l21, l22, r11, r12, r21, r22;
K.clear();
sort(Q.begin(), Q.end());
for(i=0; i<Q.size(); i=j){
for(j=i; j<Q.size() && Q[i].first == Q[j].first; j++);
for(ll &t: G[Q[i].first]){
if(!f){
tie(l11, r11) = minmax(X[t << 1], X[t << 1 | 1]);
tie(l22, r22) = minmax(Y[t << 1], Y[t << 1 | 1]);
K.emplace_back(l11 - 1, l22, r22, -Q[i].second);
K.emplace_back(r11, l22, r22, Q[i].second);
}
else{
if(X[t << 1] < X[t << 1 | 1]){
l11 = X[3], r11 = X[t << 1];
l12 = X[2], r12 = X[t << 1 | 1];
}
else{
l11 = X[t << 1], r11 = n + n;
l12 = X[t << 1 | 1], r12 = X[2];
}
if(Y[t << 1] < Y[t << 1 | 1]){
l21 = Y[1], r21 = Y[t << 1];
l22 = Y[0], r22 = Y[t << 1 | 1];
}
else{
l21 = Y[t << 1], r21 = n + n;
l22 = Y[t << 1 | 1], r22 = Y[0];
}
K.emplace_back(l11 - 1, l21, r21, -Q[i].second);
K.emplace_back(r11, l21, r21, Q[i].second);
K.emplace_back(l12 - 1, l22, r22, -Q[i].second);
K.emplace_back(r12, l22, r22, Q[i].second);
}
}
}
sort(K.begin(), K.end(), [&](query &qa, query &qb){
return qa.x < qb.x;
});
i = 0;
for(query &t: K){
for(; i<G[p].size() && X[G[p][i] << 1] <= t.x; i++){
T.addval(Y[G[p][i] << 1], 1);
}
if(t.i > 0) A[t.i] += T.getval(t.l, t.r);
else A[-t.i] -= T.getval(t.l, t.r);
}
for(; i--; ){
T.addval(Y[G[p][i] << 1], -1);
}
for(i=0; i<Q.size(); i=j){
for(j=i; j<Q.size() && Q[i].first == Q[j].first; j++){
A[Q[j].second] = A[Q[i].second];
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
ll i, a, b, c;
cin >> n >> m; n += 2;
for(i=2; i<n; i++){
cin >> P[i].x >> P[i].y >> c;
G[c].push_back(i);
}
cin >> P[0].x >> P[0].y >> P[1].x >> P[1].y;
sort(0, X); sort(1, Y);
cin >> q;
for(i=1; i<=q; i++){
cin >> a >> b;
if(G[a].size() < G[b].size()) Q1[b].emplace_back(a, i);
else Q2[a].emplace_back(b, i);
}
for(i=1; i<=m; i++){
sort(G[i].begin(), G[i].end(), [&](ll &a, ll &b){
return X[a << 1] < X[b << 1];
});
solve(0, i); solve(1, i);
}
for(i=1; i<=q; i++){
cout << A[i] << endl;
}
return 0;
}
Compilation message (stderr)
dragon2.cpp: In function 'void sort(ll, ll*)':
dragon2.cpp:66:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(i=0; i<V.size(); i++){
~^~~~~~~~~
dragon2.cpp: In function 'void solve(ll, ll)':
dragon2.cpp:80:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(i=0; i<Q.size(); i=j){
~^~~~~~~~~
dragon2.cpp:81:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(j=i; j<Q.size() && Q[i].first == Q[j].first; j++);
~^~~~~~~~~
dragon2.cpp:123:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(; i<G[p].size() && X[G[p][i] << 1] <= t.x; i++){
~^~~~~~~~~~~~
dragon2.cpp:134:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(i=0; i<Q.size(); i=j){
~^~~~~~~~~
dragon2.cpp:135:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(j=i; j<Q.size() && Q[i].first == Q[j].first; 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... |