#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define st first
#define nd second
typedef long long ll;
typedef long double ld;
const ll I = 1000'000'000'000'000'000LL;
const int II = 2'000'000'000;
const ll M = 1000'000'007LL;
const int N = 30'007;
vector<int> sp[N];
pair<ll, ll> tab[N], ta[N], tb[N], A, B;
ll d[N];
map<pair<int, int>, int> answer;
bool C(int i, int j)
{
if(!((d[i] < 0) ^ (d[j] < 0)))
if(abs(d[i]) < abs(d[j]))
return 0;
ll x = tab[j].st - tab[i].st, y = tab[j].nd - tab[i].nd;
ll a = x * ta[i].nd - y * (ta[i].st);
ll b = x * tb[i].nd - y * (tb[i].st);
return ((a > 0) ^ (b > 0));
}
inline int Cnt(int a, int b)
{
int ans = 0;
for(int i = 0; i < (int)sp[a].size(); ++i)
for(int j = 0; j < (int)sp[b].size(); ++j)
ans += (int)C(sp[a][i], sp[b][j]);
return ans;
}
void Solve()
{
int n, m, x, q;
cin >> n >> m;
for(int i = 1; i <= n; ++i)
{
cin >> tab[i].st >> tab[i].nd >> x;
sp[x].pb(i);
}
cin >> A.st >> A.nd >> B.st >> B.nd;
for(int i = 1; i <= n; ++i)
{
ta[i] = make_pair(A.st - tab[i].st, A.nd - tab[i].nd);
tb[i] = make_pair(B.st - tab[i].st, B.nd - tab[i].nd);
d[i] = ta[i].st * tb[i].nd - ta[i].nd * tb[i].st;
}
cin >> q;
int a, b;
for(int i = 1; i <= q; ++i)
{
cin >> a >> b;
if(answer.find(make_pair(a, b)) == answer.end())
answer[make_pair(a, b)] = Cnt(a, b);
cout << answer[make_pair(a, b)] << "\n";
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
//int t; cin >> t;
//while(t--)
Solve();
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |