Cod sursa(job #203606)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 17 august 2008 22:51:45
Problema Gropi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.53 kb
#include<stdio.h>
#include<algorithm>
#include<stdlib.h>

#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 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(gr a,gr b)
{
return a.second<b.second;
}

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",&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);

    if (y1>y2)
       {
       swap(x1,x2);
       swap(y1,y2);
       }

stanga=1;
dreapta=N;

while (stanga<=dreapta)
      {
       mijloc=(stanga+dreapta)>>1;
       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)>>1;
       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;
}