Pagini recente » Cod sursa (job #872083) | Cod sursa (job #1588591) | Cod sursa (job #269085) | Cod sursa (job #574240) | Cod sursa (job #1487612)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define maxN 50002
#define pb push_back
#define mp make_pair
#define x first
#define y second
#define nrC 4
using namespace std;
int x, y, w[maxN], n, i, j, sol;
pair < int , int > vi;
int cmp (pair <int, int> a, pair <int, int> b)
{
if (a.x == b.x)
return a.y < b.y;
return a.x < b.y;
}
vector < pair <int, int> > V[nrC];
void read()
{
int i;
freopen("pachete.in", "r", stdin);
scanf("%d", &n);
scanf("%d %d", &x, &y);
for (i = 1; i <= n; ++ i)
{
scanf("%d %d", &vi.x, &vi.y);
vi.x -= x;
vi.y -= y;
if (vi.x > 0 && vi.y > 0)
V[0].pb(mp(vi.x, vi.y));
else if (vi.x > 0 && vi.y < 0)
V[1].pb(mp(vi.x, -vi.y));
else if (vi.x < 0 && vi.y > 0)
V[2].pb(mp(-vi.x, vi.y));
else
V[3].pb(mp(-vi.x, -vi.y));
}
}
int bs(int a)
{
int i = 1, p = 1 << 15;
while (p)
{
if (i + p <= w[0] && w[i + p] <= a)
i += p;
p /= 2;
}
if (i + 1 <= w[0] && w[i] <= a)
++ i;
return i;
}
void solc(int a)
{
int i, p;
for (i = 0; i < V[a].size(); ++ i)
{
if (i == 0 || V[a][i].y >= w[w[0]])
w[++ w[0]] = V[a][i].y;
else
{
p = bs(V[a][i].y);
w[p] = V[a][i].y;
}
}
}
void solve()
{
int i;
for (i = 0; i < nrC; ++ i)
{
sort(V[i].begin(), V[i].end(), cmp);
solc(i);
sol += w[0];
w[0] = 0;
}
}
void write()
{
freopen("pachete.out", "w", stdout);
printf("%d", sol);
}
int main()
{
read();
solve();
write();
return 0;
}