Cod sursa(job #291361)

Utilizator vladbBogolin Vlad vladb Data 29 martie 2009 18:27:56
Problema Gropi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<fstream>

using namespace std;

ifstream fin("gropi.in");
ofstream fout("gropi.out");

struct groapa { int x,y;
              } a[100001];
int n,m,c,b[100001],x1,y1,x2,y2,e;

void quick(int x,int y)
{    	int i,j,p;
    groapa aux;
	if(x<y)
	{	i=x-1;
		j=y+1;
		p=a[(x+y)/2].y;
		while(i<j)
		{	do i++; while(a[i].y<p);
			do j--; while(a[j].y>p);
			if(i<j) {  aux=a[i];
				   a[i]=a[j];
				   a[j]=aux;
				}
		}
		quick(x,i-1);
		quick(j+1,y);
	}
}

int main()
{    int i,aux,st,dr,st1,mij;   
     fin>>c>>n;
     for(i=1;i<=n;i++)
        fin>>a[i].x>>a[i].y;
     quick(1,n);
     fin>>m;
     for(i=2;i<=n;i++)
     {   b[i]=b[i-1]+a[i].y-a[i-1].y;
         if(a[i].x!=a[i-1].x)
           b[i]++;
     }
     for(i=1;i<=m;i++)
     {   fin>>x1>>y1>>x2>>y2;
         if(y1>y2)
         {  aux=x1;
            x1=x2;
            x2=aux;
            aux=y1;
            y1=y2;
            y2=aux;
         }
         st=1;
         dr=n;
         while(st<=dr)
         {    mij=(st+dr)/2;
              if(y1<=a[mij].y) dr=mij-1;
                else st=mij+1;   
         }
         e=a[st].y-y1+1;
         if(a[st].x==x1)
            e++;
         st1=st;
         st=1;
         dr=n;
         while(st<=dr)
         {    mij=(st+dr)/2;
              if(y2>=a[mij].y) st=mij+1;
                else dr=mij-1;
         }
         e+=b[dr]-b[st1];
         e+=y2-a[dr].y;
         if(x2==a[dr].x) e++;
         if(st1>dr)
         {   e=y2-y1+1;
             if(x1!=x2) e++;
         }
         fout<<e<<"\n";
     }
     fin.close();
     fout.close();
     return 0;
}