Pagini recente » Cod sursa (job #1941870) | Cod sursa (job #1888913) | Cod sursa (job #958761) | Cod sursa (job #253894) | Cod sursa (job #198106)
Cod sursa(job #198106)
# include <stdio.h>
# include <algorithm>
using namespace std;
# define FIN "gropi.in"
# define FOUT "gropi.out"
# define MAXN 100010
struct two
{
long long c;
long long l;
};
struct coord
{
long long x,y;
};
two H[MAXN];
long long poz[MAXN];
long long N,M,C,i;
int I[3];
coord aux,pi,pf;
long long cmp(two a, two b)
{
return a.c<b.c;
}
long long search(long long val)
{
long long st = 0, dr = N+1, mij, rez = 0;
while (st <= dr)
{
mij = (st + dr) >> 1;
if (H[mij].c <= val)
{
rez = mij;
st = mij + 1;
}
else dr = mij - 1;
}
return rez;
}
long long ok(long long x1,long long x2,long long y1,long long y2)
{
long long sol = 0;
if (x1 == x2)
if (y1 == y2) sol = 0;
else sol = 1;
if (x1 != x2)
{
if (H[x2].l == H[x2+1].l)
if (H[x2].l == y2) sol = poz[x2] + 1;
else sol = poz[x2];
if (H[x2].l != H[x2+1].l)
if (H[x2].l == y2) sol = poz[x2] + 1;
else sol = poz[x2];
if (H[x1].l == H[x1+1].l)
if (H[x1].l == y1) sol -= poz[x1] + 1;
else sol -= poz[x1];
if (H[x1].l != H[x1+1].l)
if (H[x1].l == y1) sol -= poz[x1] + 1;
else sol -= poz[x1];
}
return sol;
}
int main()
{
freopen(FIN,"r",stdin);
freopen(FOUT,"w",stdout);
scanf("%lld %lld",&C,&N);
for (i = 1; i <= N; ++i)
scanf("%lld %lld",&H[i].l,&H[i].c);
sort(H+1,H+N+1,cmp);
long long ct, linie;
linie = H[1].l;
ct = 1;
I[1] = 2; I[2] = 1;
H[0].l = I[H[1].l];
H[N+1].l = I[H[N].l];
H[N+1].c = C+1;
for (i = 1; i <= N+1; ++i)
if (H[i].l != H[i-1].l) poz[i] = ++ct;
else poz[i] = ct;
long long rez;
scanf("%lld",&M);
for (i = 1; i <= M; ++i)
{
scanf("%lld %lld",&pi.x,&pi.y);
scanf("%lld %lld",&pf.x,&pf.y);
if (pf.y < pi.y)
{
aux = pf;
pf = pi;
pi = aux;
}
long long x1, x2;
x1 = search(pi.y);
x2 = search(pf.y);
rez = pf.y - pi.y + 1 + ok(x1,x2,pi.x,pf.x);
printf("%lld\n",rez);
}
return 0;
}