Cod sursa(job #203615)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 17 august 2008 23:04:05
Problema Gropi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#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;
}