Pagini recente » Cod sursa (job #152752) | Cod sursa (job #785926) | Cod sursa (job #2983912) | Cod sursa (job #2586599) | Cod sursa (job #197817)
Cod sursa(job #197817)
#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 100010
int unu[N],doi[N],n,c,m;
bool compar(const int &x,const int &y)
{
if(x<y)
return true;
return false;
}
void preluc()
{
unu[++unu[0]]=c+1;
doi[++doi[0]]=c+1;
unu[++unu[0]]=0;
doi[++doi[0]]=0;
sort(unu+1,unu+unu[0]+1,compar);
sort(doi+1,doi+doi[0]+1,compar);
}
int caut(int x,const int *v)
{
int p=1,u=v[0],mij;
if(v[0]==0)
return 0;
while(p<u)
{
mij=(p+u)>>1;
if(x<=v[mij])
u=mij;
else
p=mij+1;
}
if(p>v[0])
p=v[0];
return p;
}
void rezolva()
{
int x1,y1,x2,y2,pasi=1,x,y;
bool sens;
int aux;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if((x1==x2)&&(y1==y2))
{
printf("0\n");
return;
}
if(y1<y2)
sens=true;
else
sens=false;
x=x1;
y=y1;
if(sens==true)
{
while(y!=y2)
{
if(x==1)
{
aux=caut(y,unu);
if(aux)
{
while((unu[aux]<y)&&(aux<unu[0]))
aux++;
}
if((unu[aux]>y2)||(!aux))
{
pasi+=y2-y;
y=y2;
}
else
{
pasi+=unu[aux]-y;
y=unu[aux]-1;
x=2;
}
}
else
{
aux=caut(y,doi);
if(aux)
{
while((doi[aux]<y)&&(aux<doi[0]))
aux++;
}
if((doi[aux]>y2)||(!aux))
{
pasi+=y2-y;
y=y2;
}
else
{
pasi+=doi[aux]-y;
y=doi[aux]-1;
x=1;
}
}
}
}
else
{
while(y!=y2)
{
if(x==1)
{
aux=caut(y,unu);
while((unu[aux]>y)&&(aux>1))
aux--;
if((unu[aux]<y2)||(!aux))
{
pasi+=y-y2;
y=y2;
}
else
{
pasi+=y-unu[aux];
y=unu[aux]+1;
x=2;
}
}
else
{
aux=caut(y,doi);
while((doi[aux]>y)&&(aux>1))
aux--;
if((doi[aux]<y2)||(!aux))
{
pasi+=y-y2;
y=y2;
}
else
{
pasi+=y-doi[aux];
y=doi[aux]+1;
x=1;
}
}
}
}
if(x!=x2)
pasi++;
printf("%d\n",pasi);
}
void citire()
{
int i,x,y;
scanf("%d%d",&c,&n);
for(i=0; i<n; i++)
{
scanf("%d%d",&x,&y);
if(x==1)
unu[++unu[0]]=y;
else
doi[++doi[0]]=y;
}
preluc();
scanf("%d",&m);
for(i=0; i<m; i++)
rezolva();
}
int main()
{
freopen("gropi.in","r",stdin);
freopen("gropi.out","w",stdout);
citire();
return 0;
}