Cod sursa(job #202017)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 5 august 2008 16:28:17
Problema Marbles Scor 90
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.6 kb
var v:array[-2..100010,0..64]of longint;   
    b,poz,a,c:array[-2..100010]of longint;   
    n,i,j,k,m,x,y,z,l,p1,max,p2: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  
   a[i]:=b[i];   
   c[i]:=poz[i];   
   end;   
   e:=p;   
   f:=p;   
   g:=q+1;   
   while(f<=q)and(g<=r)do  
   if a[f]<a[g] then begin b[e]:=a[f];   
                           poz[e]:=c[f];   
                           e:=e+1;   
                           f:=f+1;   
                     end  
                else begin b[e]:=a[g];   
                           poz[e]:=c[g];   
                           e:=e+1;   
                           g:=g+1;   
                     end;   
   for i:=f to q do  
   begin  
   b[e]:=a[i];   
   poz[e]:=c[i];   
   e:=e+1;   
   end;   
   for i:=g to r do  
   begin  
   b[e]:=a[i];   
   poz[e]:=c[i];   
   e:=e+1;   
   end;   
end;   
begin  
   b[0]:=-200000010;   
   b[-1]:=-200000010;   
   assign(f1,'marbles.in');   
   reset(f1);   
   assign(f2,'marbles.out');   
   rewrite(f2);   
   read(f1,n,m);   
   b[n+1]:=2000000010;   
   b[n+2]:=2000000010;   
   for i:=1 to n do  
   read(f1,b[i],poz[i]);   
   merge(1,n);   
   for i:=1 to n do  
   begin  
   v[i]:=v[i-1];   
   v[i,poz[i]]:=v[i,poz[i]]+1;   
   end;   
   for i:=1 to m do  
   begin  
   read(f1,x,y,z);   
   if x=0 then b[i]:=b[i]+z   
          else begin k:=0;   
                     l:=n+1;   
                     while l-k>4 do  
                     begin  
                     x:=(l+k)div 2;   
                     if b[x]>y then l:=x   
                               else k:=x;   
                     end;   
                     for j:=k-1 to l do  
                     if (b[j]<y)and(b[j+1]>=y)then p1:=j;   
                     k:=0;   
                     l:=n+1;   
                     while l-k>4 do  
                     begin  
                     x:=(l+k)div 2;   
                     if b[x]>z then l:=x   
                               else k:=x;   
                     end;   
                     for j:=k-1 to l do  
                     if (b[j]<=z)and(b[j+1]>z)then p2:=j;   
                     max:=v[p2,1]-v[p1,1];   
                     for j:=2 to 64 do  
                     if v[p2,j]-v[p1,j]>max then max:=v[p2,j]-v[p1,j];   
                     writeln(f2,max);   
               end;   
   end;   
   close(f1);   
   close(f2);   
end.