Pagini recente » Cod sursa (job #3181257) | Cod sursa (job #2916731) | Cod sursa (job #2915419) | Cod sursa (job #3181232) | Cod sursa (job #203615)
Cod sursa(job #203615)
#include<stdio.h>
#include<algorithm>
#define FIN "gropi.in"
#define FOUT "gropi.out"
#define N_MAX 101201
using namespace std;
struct gr {int first,second;} groapa[N_MAX];
int N,M,c;
int stanga,stangaa,dreapta;
int i,mijloc,aux;
int Rez;
int x1,x2,y1,y2;
int C[N_MAX];
void swap(int a,int b)
{
a^=b;
b^=a;
a^=b;
}
int cmp(gr a,gr b)
{
return a.second<b.second;
}
int main()
{
freopen(FIN,"rt",stdin);
scanf("%d %d", &c, &N);
for(i=1;i<=N;++i)
scanf("%d %d",&groapa[i].first, &groapa[i].second);
sort(groapa+1,groapa+N+1,cmp);
scanf("%d", &M);
for(i=2;i<=N;++i)
{
C[i]=C[i-1]+groapa[i].second-groapa[i-1].second;
if(groapa[i].first!=groapa[i-1].first)
C[i]++;
}
freopen(FOUT,"wt",stdout);
for(i=1;i<=M;++i)
{
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
//int aux;
if (y1>y2)
{
//swap(x1,x2);
//swap(y1,y2);
aux=x1;
x1=x2;
x2=aux;
aux=y1;
y1=y2;
y2=aux;
}
stanga=1;
dreapta=N;
while (stanga<=dreapta)
{
mijloc=(stanga+dreapta)/2;
if (y1<=groapa[mijloc].second)
dreapta=mijloc-1;
else
stanga=mijloc+1;
}
Rez=groapa[stanga].second-y1+1;
if (groapa[stanga].first==x1)
Rez++;
stangaa=stanga;
stanga=1;
dreapta=N;
while (stanga<=dreapta)
{
mijloc=(stanga+dreapta)/2;
if (y2>=groapa[mijloc].second)
stanga=mijloc+1;
else
dreapta=mijloc-1;
}
Rez+=C[dreapta]-C[stangaa];
Rez+=y2-groapa[dreapta].second;
if (x2==groapa[dreapta].first)
Rez++;
if (stangaa>dreapta)
{
Rez=y2-y1+1;
if(x1!=x2)
Rez++;
}
printf("%d\n", Rez);
}
return 0;
}