Cod sursa(job #197609)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 5 iulie 2008 12:04:54
Problema Gropi Scor 0
Compilator cpp Status done
Runda Junior Challenge 2008 Marime 2.13 kb
#include <fstream>
std::ifstream f1("gropi.in");
std::ofstream f2("gropi.out");
long part(long a[100100], long p, long q);
void quicksort(long sir[100100], long jos, long sus);
long bsearch(long sir[100100], long jos, long sus, long x);

int main()
{
  long c, n, i, unu[100100], doi[100100], nrUnu, nrDoi, pozUnu, pozDoi, m, x1, x2, y1, y2, a, b, t;
	unsigned long cont;
	f1>>c>>n;
	for (i=0; i<n; i++)
	{
		f1>>a>>b;
		if (a==1)
			unu[nrUnu++]=b;
		else
			doi[nrDoi++]=b;
	}//for i
	quicksort(unu, 0, nrUnu-1);
	quicksort(doi, 0, nrDoi-1);
	f1>>m;
	for (i=0; i<m; i++)
	{
		f1>>x1>>x2>>y1>>y2;
		if (x2>y2)
		{
			t=x1;
			x1=y1;
			y1=t;
			t=x2;
			x2=y2;
			y2=t;
		}//if
		pozUnu=0;
		pozDoi=0;
		cont=1;
		while ((x1!=y1)||(x2!=y2))
		{
  		if (x1==1)
			{
	  		pozUnu=bsearch(unu, pozUnu, nrUnu-1, x2);
			  if (unu[pozUnu]<x2)
				  pozUnu++;
			  if ((unu[pozUnu]>y2)||(unu[nrUnu-1]<x2))
			  {
				  cont+=y2-x2;
					x2=y2;
					if (y1==2)
					{
						cont++;
						x1=2;
					}//if
			  }//if
				else
				{
					cont+=unu[pozUnu]-1-x2;
					x2=unu[pozUnu]-1;
					cont++;
					x1=2;
				}//else
			}//if
			else
			{
	  		pozDoi=bsearch(doi, pozDoi, nrDoi-1, x2);
			  if (doi[pozDoi]<x2)
				  pozDoi++;
			  if ((doi[pozDoi]>y2)||(doi[nrDoi-1]<x2))
			  {
				  cont+=y2-x2;
					x2=y2;
					if (y1==1)
					{
						cont++;
						x1=1;
					}//if
			  }//if
				else
				{
					cont+=doi[pozDoi]-1-x2;
					x2=doi[pozDoi]-1;
					cont++;
					x1=1;
				}//else				
			}//else
		}//while
		f2<<cont<<"\n";
	}//for i
	f1.close();
	f2.close();
}//main

long part(long a[100100], long p, long q)
{
	long x=a[p];
	long t, j, i=p;
	for (j=p+1; j<=q; j++)
		if (a[j]<=x)
		{
			i++;
			t=a[i];
			a[i]=a[j];
			a[j]=t;
		}//if
	t=a[p];
	a[p]=a[i];
	a[i]=t;
	return i;
}//part

void quicksort(long sir[100100], long jos, long sus)
{
	long p;
	if (jos<sus)
	{
		p=part(sir, jos, sus);
		quicksort(sir, jos, p-1);
		quicksort(sir, p+1, sus);
	}//if
}//quicksort

long bsearch(long sir[100100], long jos, long sus, long x)
{
	long m=(jos+sus)/2;
	while ((jos<sus)&&(sir[m]!=x))
	{
		if (x<sir[m])
			sus=m-1;
		else
			jos=m+1;
		m=(jos+sus)/2;
	}//while
	return m;
}//bsearch