Cod sursa(job #565726)

Utilizator bora_marianBora marian bora_marian Data 28 martie 2011 11:09:03
Problema Gropi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<fstream>
#include<algorithm>
#define DIM 100003
using namespace std;
int dist[DIM],poz;
int C,n,M;
struct gr{
	int a,b;};
gr V[DIM];
void cautare(int st,int dr,int val);
void solve();
int comp(gr x,gr y);	
int main()
{
	ifstream fin("gropi.in");
	ofstream fout("gropi.out");
	fin>>C>>n;
	int i;
	for(i=1;i<=n;i++)
       fin>>V[i].a>>V[i].b;
    sort(V+1,V+n+1,comp);   
    solve();
    fin>>M;
    for(i=1;i<=M;i++)
     {
		int dis=0;
		int x1,y1,x2,y2;
		fin>>x1>>y1>>x2>>y2;
		if(y1>y2)
		  swap(y1,y2),swap(x1,x2);
		poz=n+1;
		cautare(1,n,y1);
		int gri=poz;
		poz=n+1;
		cautare(1,n,y2);
		int grf=poz;
		//fout<<"bau bau"<<gri<<" "<<grf<<"mai tare ";
		if(gri!=grf)
		{
		  grf--;
		  if(x1==V[gri].a)
		    dis+=V[gri].b-y1+2;
		  else
		    dis+=V[gri].b-y1+1;
		//fout<<dis<<" ";
		dis+=dist[grf]-dist[gri];
		//fout<<dis<<" ";
		if(x2==V[grf].a)
		  dis+=y2-V[grf].b+1;
		else
		  dis+=y2-V[grf].b;
	     }
	     else
	     {
			 if(x1==x2)
			   dis+=y2-y1+1;
			 else
			   dis+=y2-y1+2;
		   }   
		fout<<dis<<"\n";
	}  	        
    return 0;
}
void solve()
{
	int i;
	for(i=2;i<=n;i++)
	   if(V[i].a!=V[i-1].a)
	     dist[i]=dist[i-1]+V[i].b-V[i-1].b+1;
	   else
	     dist[i]=dist[i-1]+V[i].b-V[i-1].b;
}
void cautare(int st,int dr,int val)
{   
	if(st==dr)
	{
		if(V[st].b>=val && st<poz)
		  poz=st;
		return ;
	}
	else
	{
		int mij=(st+dr)/2;
		if(V[mij].b>val)
		{
			if(mij<poz)
			  poz=mij;
			cautare(st,mij,val);
		}
		else
		   cautare(mij+1,dr,val);
	 }
}
int comp(gr x,gr y)
{
	if(x.b>y.b)
	  return 0;
	return 1;
}