Cod sursa(job #197794)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 6 iulie 2008 10:26:38
Problema Gropi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include<stdio.h>
long n,m,g[100002][3],i,j,c,is,xa,xb,ya,yb,g1,g2,sol,aux,left,right,middle;
void sort();
void heapdown(long ii, long nn);
void swap(long a, long b);
int main()
{
	freopen("gropi.in","r",stdin);
	freopen("gropi.out","w",stdout);
	scanf("%ld%ld",&c,&n);
	for(i=1;i<=n;i++) scanf("%ld%ld",&g[i][0],&g[i][1]);
	sort();
	for(i=2;i<=n;i++)
	 { g[i][2]=g[i-1][2];if(g[i][0]!=g[i-1][0])g[i][2]++;}
	scanf("%ld",&m);
	for(i=1;i<=m;i++)
	{ scanf("%ld%ld%ld%ld",&xa,&ya,&xb,&yb);
	  if(ya>yb){ aux=ya; ya=yb; yb=aux;
		     aux=xa; xa=xb; xb=aux;
		   }
          left=0;right=n+1;
	  while(right-left-1)
	  { middle=(left+right)/2;
	    if(g[middle][1]<ya)left=middle;
	    else right=middle;
	  }
	  g1=right;
	  left=0;right=n+1;
	  while(right-left-1)
	  { middle=(left+right)/2;
	    if(g[middle][1]>yb)right=middle;
	    else left=middle;
	  }
          g2=left;
          if(g2<g1)
          {
                sol=yb-ya+1;
                if(xa!=xb)sol++;
          }
          else
          {
                sol=yb-ya+1+g[g2][2]-g[g1][2];
                if(xa==g[g1][0])sol++;
                if(xb==g[g2][0])sol++;
           }
           printf("%ld\n",sol);
        }
          return 0;
}
void sort()
{       for(i=n/2;i>=1;i--) heapdown(i,n);
        for(i=n;i>=1;i--) { swap(1,i);
                            heapdown(1,i-1);
                           }
}
void heapdown(long ii, long nn)
{       if(2*ii>nn) return;
        long is=2*ii;
        if(2*ii<nn) if(g[2*ii][1]<g[2*ii+1][1]) is=2*ii+1;
        if(g[ii][1]<g[is][1]){ swap(ii,is); heapdown(is,nn);}
        return;
}
void swap(long a, long b)
{
        aux=g[a][0]; g[a][0]=g[b][0]; g[b][0]=aux;
        aux=g[a][1]; g[a][1]=g[b][1]; g[b][1]=aux;
}