Mai intai trebuie sa te autentifici.
Cod sursa(job #203600)
Utilizator | Data | 17 august 2008 22:34:28 | |
---|---|---|---|
Problema | Gropi | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.38 kb |
#include<stdio.h>
#include <algorithm.h>
#include<stdlib.h>
#define FIN "gropi.in"
#define FOUT "gropi.out"
#define N_MAX 100120
int N,M,c;
int stanga,stangaa,dreapta;
int i,mijloc,aux;
int Rez;
int x1,x2,y1,y2;
int A[N_MAX],B[N_MAX],C[N_MAX];
void q_sort(int numbers[], int left, int right)
{
int pivot, l_hold, r_hold;
l_hold = left;
r_hold = right;
if(left != right)
{
int aux = numbers[left], randompoz = left + rand() % (left - right);
numbers[left] = numbers[randompoz];
numbers[randompoz] = aux;
}
pivot = numbers[left];
while (left < right)
{
while ((numbers[right] >= pivot) && (left < right))
right--;
if (left != right)
{
numbers[left] = numbers[right];
left++;
}
while ((numbers[left] <= pivot) && (left < right))
left++;
if (left != right)
{
numbers[right] = numbers[left];
right--;
}
}
numbers[left] = pivot;
pivot = left;
left = l_hold;
right = r_hold;
if (left < pivot)
q_sort(numbers, left, pivot-1);
if (right > pivot)
q_sort(numbers, pivot+1, right);
}
int cmp(int a,int b)
{
return a<b;
}
void swap(int a,int b)
{
a^=b;
b^=a;
a^=b;
}
int main()
{
freopen(FIN,"rt",stdin);
scanf("%d %d", &c, &N);
for(i=1;i<=N;++i)
scanf("%d %d",&A[i], &B[i]);
//q_sort(A,1,N);
//q_sort(B,1,N);
sort(A+1,A+N+1,cmp);
sort(B+1,B+N+1,cmp);
scanf("%d",&M);
for(i=2;i<=N;++i)
{
C[i]=C[i-1]+B[i]-B[i-1];
if(A[i]!=A[i-1])
C[i]++;
}
freopen(FOUT,"wt",stdout);
for(i=1;i<=M;++i)
{
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
if (y1>y2)
{
swap(x1,x2);
swap(y1,y2);
}
stanga=1;
dreapta=N;
while (stanga<=dreapta)
{
mijloc=(stanga+dreapta)>>1;
if (y1<=B[mijloc])
dreapta=mijloc-1;
else
stanga=mijloc+1;
}
Rez=B[stanga]-y1+1;
if (A[stanga]==x1)
Rez++;
stangaa=stanga;
stanga=1;
dreapta=N;
while (stanga<=dreapta)
{
mijloc=(stanga+dreapta)>>1;
if (y2>=B[mijloc])
stanga=mijloc+1;
else
dreapta=mijloc-1;
}
Rez+=C[dreapta]-C[stangaa];
Rez+=y2-B[dreapta];
if (x2==A[dreapta])
Rez++;
if (stangaa>dreapta)
{
Rez=y2-y1+1;
if(x1!=x2)
Rez++;
}
printf("%d\n", Rez);
}
return 0;
}