Cod sursa(job #197646)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 5 iulie 2008 13:05:37
Problema Gropi Scor 50
Compilator cpp Status done
Runda Junior Challenge 2008 Marime 1.19 kb
#include<stdio.h>
long c,n,i,rr,r[3][110000],poz,l[3],t,x1,x2,y1,y2,s,tt,x;
long partit(long a[ ],long st, long dr)
{long i,j,m,piv,aa;
 m=(st+dr)/2;
 piv=a[m];
 i=st-1;
 j=dr+1;
 while(1)
  {do{++i;} while(a[i]<piv);
   do{--j;} while(a[j]>piv);
   if (i<j)
	 {aa=a[i];a[i]=a[j];a[j]=aa;}
	   else
	 return j;
  }
}
void quicks(long a[ ],long st,long dr)
{long p;
 if (st<dr)
   {p=partit(a,st,dr);
	quicks(a,st,p);
	quicks(a,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",&rr,&poz);
     if(rr==1) r[1][++l[1]]=poz;
         else r[2][++l[2]]=poz;
    }
 quicks(r[1],1,l[1]);
 quicks(r[2],1,l[2]);
 r[1][l[1]+1]=2100000000;
 r[2][l[2]+1]=2100000000;
 scanf("%ld",&t);
 for(tt=1;tt<=t;++tt)
    {
     scanf("%ld%ld%ld%ld",&x1,&y1,&x2,&y2);
     s=1;
     if(y1>y2){x=x1;x1=x2;x2=x;x=y1;y1=y2;y2=x;}
     while(!(x1==x2&&y1==y2))
       {
        for(i=1;r[x1][i]<y1&&i<=l[x1];++i);
        if(r[x1][i]>y2){s+=y2-y1;if(x1!=x2)++s;printf("%ld\n",s);break;}
        else{s+=r[x1][i]-y1;y1=r[x1][i]-1;x1=(x1%2)+1;}
       }
    }
 return 0;
}