Cod sursa(job #303670)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 10 aprilie 2009 09:59:00
Problema Gropi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<stdio.h>
long c,n,i,x[100005],y[100005],stt,drr,l,prim[100005],st[100005],dr[100005],ult[100005],poz[100005],a,b,aa,bb,m,ab,mij,mijj,sum;
long partit(long a[ ],long b[ ],long st, long dr)
{long i,j,m,piv,aa;
 m=(st+dr)/2;
 piv=b[m];
 i=st-1;
 j=dr+1;
 while(1)
  {do{++i;} while(b[i]<piv);
   do{--j;} while(b[j]>piv);
   if (i<j)
	 {aa=a[i];a[i]=a[j];a[j]=aa;aa=b[i];b[i]=b[j];b[j]=aa;}
	   else
	 return j;
  }
}
void quicks(long a[ ],long b[ ],long st,long dr)
{long p;
 if (st<dr)
   {p=partit(a,b,st,dr);
    quicks(a,b,st,p);
    quicks(a,b,p+1,dr);
   }
}
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",&x[i],&y[i]);
 quicks(x,y,1,n);
 stt=0;
 l=1;
 x[n+1]=c+1;
 prim[l]=y[1];
 for(i=2;i<=n+1;++i)
    if(x[i]!=x[i-1]){st[l]=stt;dr[l]=x[i]-1;poz[l]=x[i-1];ult[l]=y[i-1];++l;stt=x[i]-1;prim[l]=y[i];}
 --l;
 scanf("%ld",&m);
 for(i=1;i<=m;++i)
    {scanf("%ld%ld%ld%ld",&a,&b,&aa,&bb);
    if(bb<b){ab=bb;bb=b;b=ab;ab=aa;aa=a;a=ab;}
     stt=1;drr=l;
     while(stt<=drr)
      {mij=(stt+drr)/2;
       if(st[mij]<=b&&dr[mij]>=b)break;
       if(st[mij]>b)drr=mij-1;
        else stt=mij+1;}
     stt=1;drr=l;
     while(stt<=drr)
      {mijj=(stt+drr)/2;
       if(st[mijj]<=bb&&dr[mijj]>=bb)break;
       if(st[mijj]>bb)drr=mijj-1;
        else stt=mijj+1;}
     sum=bb-b+1+mijj-mij-2;
     if(ult[mij]>=b)
       if(a==poz[mij])
          sum+=2;
          else ++sum;
          else if(a!=poz[mijj])++sum;
     if(prim[mijj]<=bb)
       if(aa==poz[mijj])
         sum+=2;
         else ++sum;
         else if(aa!=poz[mijj])++sum;
     printf("%ld\n",sum);}
 return 0;
}