Cod sursa(job #197671)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 5 iulie 2008 13:47:12
Problema Gropi Scor 50
Compilator fpc Status done
Runda Junior Challenge 2008 Marime 2.68 kb
var a,b,c,v1,v2,a1,a2:array[1..100100]of longint;
    n,i,j,k,o,x1,m,x2,y1,y2,c1,c2,c3,k1,k2,l,r1,r2:longint;
    f1,f2:text;
procedure merge(p,r:longint);
var q,e,f,g:longint;
begin
   q:=(p+r)div 2;
   if p<q then merge(p,q);
   if q+1<r then merge(q+1,r);
   for i:=p to r do
   begin
   a1[i]:=v1[i];
   a2[i]:=v2[i];
   end;
   e:=p;
   f:=q+1;
   g:=p;
   while(e<=q)and(f<=r)do
   if a2[e]<a2[f] then begin v2[g]:=a2[e];
                             v1[g]:=a1[e];
                             e:=e+1;
                             g:=g+1;
                       end
                  else begin v2[g]:=a2[f];
                             v1[g]:=a1[f];
                             f:=f+1;
                             g:=g+1;
                       end;
   while(e<=q)do
   begin
   v2[g]:=a2[e];
   v1[g]:=a1[e];
   g:=g+1;
   e:=e+1;
   end;
   while(f<=r)do
   begin
   v2[g]:=a2[f];
   v1[g]:=a1[f];
   g:=g+1;
   f:=f+1;
   end;
end;
begin
   assign(f1,'gropi.in');
   reset(f1);
   assign(f2,'gropi.out');
   rewrite(f2);
   read(f1,o,n);
   for i:=1 to n do
   read(f1,v1[i],v2[i]);
   merge(1,n);
   k:=1;
   l:=1;
   a[1]:=1;
   c[1]:=v1[1];
   for i:=2 to n do
   if v1[i]<>c[k] then begin b[k]:=v2[i]-1;
                             k:=k+1;
                             c[k]:=v1[i];
                             a[k]:=v2[i-1]+1;
                       end;
   b[k]:=o;
   read(f1,m);
   for i:=1 to m do
   begin
   read(f1,x1,y1,x2,y2);
   if y1>y2 then begin c1:=y1;
                       y1:=y2;
                       y2:=c1;
                       c1:=x1;
                       x1:=x2;
                       x2:=c1;
                 end;
   c1:=1;
   c2:=k;
   while(c2-c1>2)do
   begin
   c3:=(c1+c2)div 2;
   if(y1<a[c3])then c2:=c3-1
               else c1:=c3;
   end;
   r1:=0;
   r2:=0;
   for j:=c1-1 to c2+1 do
   if(a[j]<=y1)and(y1<=b[j])then begin k1:=j;
                                       r1:=r1+1;
                                 end;
   c1:=1;
   c2:=k;
   while(c2-c1>2)do
   begin
   c3:=(c1+c2)div 2;
   if(y2>b[c3])then c1:=c3+1
               else c2:=c3;
   end;
   l:=0;
   for j:=c2+1 downto c1-1 do
   if(a[j]<=y2)and(y2<=b[j])then begin k2:=j;
                                       r2:=r2+1;
                                 end;
   if x1=c[k1] then l:=l+1;
   if x2=c[k2] then l:=l+1;
   if((r2=2)and(r1=2)and(abs(k1-k2)<1))or((y1<v2[1])and(y2<v2[1]))or((y1>v2[n])and(y2>v2[n]))then writeln(f2,y2-y1+1+abs(x1-x2))
                                                                                             else writeln(f2,y2-y1+1+l+k2-k1);
   end;
   close(f1);
   close(f2);
end.