Cod sursa(job #203614)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 17 august 2008 23:03:37
Problema Gropi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.78 kb
#include<stdio.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);   
}   
  
  
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);   
  
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]++;   
    }   
  
  
for(i=1;i<=M;++i)   
   {   
    scanf("%d %d %d %d",&x1,&y1,&x2,&y2);   
  
    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)>>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++;   
   }      
     
freopen(FOUT,"wt",stdout);   
printf("%d\n", Rez);   
}   
return 0;   
}