Pagini recente » Cod sursa (job #419656) | Cod sursa (job #2203070) | Cod sursa (job #2081495) | Cod sursa (job #3159051) | Cod sursa (job #197794)
Cod sursa(job #197794)
#include<stdio.h>
long n,m,g[100002][3],i,j,c,is,xa,xb,ya,yb,g1,g2,sol,aux,left,right,middle;
void sort();
void heapdown(long ii, long nn);
void swap(long a, long b);
int main()
{
freopen("gropi.in","r",stdin);
freopen("gropi.out","w",stdout);
scanf("%ld%ld",&c,&n);
for(i=1;i<=n;i++) scanf("%ld%ld",&g[i][0],&g[i][1]);
sort();
for(i=2;i<=n;i++)
{ g[i][2]=g[i-1][2];if(g[i][0]!=g[i-1][0])g[i][2]++;}
scanf("%ld",&m);
for(i=1;i<=m;i++)
{ scanf("%ld%ld%ld%ld",&xa,&ya,&xb,&yb);
if(ya>yb){ aux=ya; ya=yb; yb=aux;
aux=xa; xa=xb; xb=aux;
}
left=0;right=n+1;
while(right-left-1)
{ middle=(left+right)/2;
if(g[middle][1]<ya)left=middle;
else right=middle;
}
g1=right;
left=0;right=n+1;
while(right-left-1)
{ middle=(left+right)/2;
if(g[middle][1]>yb)right=middle;
else left=middle;
}
g2=left;
if(g2<g1)
{
sol=yb-ya+1;
if(xa!=xb)sol++;
}
else
{
sol=yb-ya+1+g[g2][2]-g[g1][2];
if(xa==g[g1][0])sol++;
if(xb==g[g2][0])sol++;
}
printf("%ld\n",sol);
}
return 0;
}
void sort()
{ for(i=n/2;i>=1;i--) heapdown(i,n);
for(i=n;i>=1;i--) { swap(1,i);
heapdown(1,i-1);
}
}
void heapdown(long ii, long nn)
{ if(2*ii>nn) return;
long is=2*ii;
if(2*ii<nn) if(g[2*ii][1]<g[2*ii+1][1]) is=2*ii+1;
if(g[ii][1]<g[is][1]){ swap(ii,is); heapdown(is,nn);}
return;
}
void swap(long a, long b)
{
aux=g[a][0]; g[a][0]=g[b][0]; g[b][0]=aux;
aux=g[a][1]; g[a][1]=g[b][1]; g[b][1]=aux;
}