Guest User

Untitled

a guest
Jun 23rd, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 7.72 KB | None | 0 0
  1. {R+,S+,Q+,I+,O-}
  2. {$R-,S-,Q-,I-,O+}
  3. {$M 50000000}
  4. var
  5.   pp: array [0..20,0..200010] of longint;
  6.   state,id,pe,sz,hang,nv,num,pred,last,tin,tout,ss,ff,pv,p: array [0..200010] of longint;
  7.   zeros,ones: array [0..555555] of longint;
  8.   inv: array [0..555555] of boolean;
  9.   head,dp,ww,d,pd,ps,pf: array [0..200010] of longint;
  10.   h,good,was: array [0..200010] of boolean;
  11.   spec,cntl,tlight,ans,qx,qy,zz,len,rrr,kw,kp,kd,max,km,q,j,xx,yy,root,qq,tt,i,edge,n,m,time: longint;
  12.  
  13. function findset(x:longint):longint;
  14. begin
  15.   if x <> p[x] then p[x]:=findset(p[x]);
  16.   findset:=p[x];
  17. end;
  18.  
  19. procedure rec(v:longint);
  20. var
  21.   j: longint;
  22. begin
  23.   inc(kw);
  24.   ww[kw]:=v;
  25.   inc(time);
  26.   tin[v]:=time;
  27.   was[v]:=True;
  28.   sz[v]:=1;
  29.   j:=last[v];
  30.   while j > 0 do
  31.   begin
  32.     if (num[j] <> num[edge]) and (not was[ff[j]]) then
  33.     begin
  34.       pv[ff[j]]:=v;
  35.       pe[ff[j]]:=num[j];
  36.       rec(ff[j]);
  37.       inc(sz[v],sz[ff[j]]);
  38.     end;
  39.     j:=pred[j];
  40.   end;
  41.   inc(time);
  42.   tout[v]:=time;
  43. end;
  44.  
  45. function lca(x,y:longint):longint;
  46. var
  47.   j,q: longint;
  48. begin
  49.   if (tin[y] >= tin[x]) and (tout[y] <= tout[x]) then lca:=x else
  50.   if (tin[x] >= tin[y]) and (tout[x] <= tout[y]) then lca:=y else
  51.   begin
  52.     for j:=17 downto 0 do
  53.     begin
  54.       q:=pp[j,x];
  55.       if (tin[y] >= tin[q]) and (tout[y] <= tout[q]) then continue;
  56.       x:=q;
  57.     end;
  58.     lca:=pv[x];
  59.   end;
  60. end;
  61.  
  62. procedure findpath(stt:longint);
  63. var
  64.   j,hd: longint;
  65. begin
  66.   j:=stt;
  67.   inc(kp);
  68.   ps[kp]:=kd+1;
  69.   while h[num[pe[stt]]] do
  70.   begin
  71.     was[stt]:=True;
  72.     inc(kd);
  73.     d[kd]:=num[pe[stt]];
  74.     dp[kd]:=kp;
  75.     pd[d[kd]]:=kd;
  76.     stt:=pv[stt];
  77.   end;
  78.   hd:=stt;
  79.   while j <> hd do
  80.   begin
  81.     head[j]:=hd;
  82.     j:=pv[j];
  83.   end;
  84.   head[hd]:=hd;
  85.   pf[kp]:=kd;
  86. end;
  87.  
  88. procedure build(x,l,r:longint);
  89. begin
  90.   zeros[x]:=r-l+1;
  91.   ones[x]:=0;
  92.   if l < r then
  93.   begin
  94.     build(x+x,l,(l+r) shr 1);
  95.     build(x+x+1,(l+r) shr 1+1,r);
  96.   end;
  97. end;
  98.  
  99. function findsum(x,l,r,ll,rr:longint):longint;
  100. var
  101.   tmp: longint;
  102. begin
  103.   if (ll > r) or (l > rr) then findsum:=0 else
  104.   if (l >= ll) and (r <= rr) then findsum:=ones[x] else
  105.   begin
  106.     if inv[x] then
  107.     begin
  108.       tmp:=ones[x+x]; ones[x+x]:=zeros[x+x]; zeros[x+x]:=tmp;
  109.       tmp:=ones[x+x+1]; ones[x+x+1]:=zeros[x+x+1]; zeros[x+x+1]:=tmp;
  110.       inv[x+x]:=not inv[x+x];
  111.       inv[x+x+1]:=not inv[x+x+1];
  112.       inv[x]:=False;
  113.     end;
  114.     findsum:=findsum(x+x,l,(l+r) shr 1,ll,rr)+findsum(x+x+1,(l+r) shr 1+1,r,ll,rr);
  115.   end;
  116. end;
  117.  
  118. procedure modify(x,l,r,ll,rr:longint);
  119. var
  120.   tmp: longint;
  121. begin
  122.   if (ll > r) or (l > rr) then exit else
  123.   if (l >= ll) and (r <= rr) then
  124.   begin
  125.     tmp:=ones[x]; ones[x]:=zeros[x]; zeros[x]:=tmp;
  126.     inv[x]:=not inv[x];
  127.   end else
  128.   begin
  129.     if inv[x] then
  130.     begin
  131.       tmp:=ones[x+x]; ones[x+x]:=zeros[x+x]; zeros[x+x]:=tmp;
  132.       tmp:=ones[x+x+1]; ones[x+x+1]:=zeros[x+x+1]; zeros[x+x+1]:=tmp;
  133.       inv[x+x]:=not inv[x+x];
  134.       inv[x+x+1]:=not inv[x+x+1];
  135.       inv[x]:=False;
  136.     end;
  137.     modify(x+x,l,(l+r) shr 1,ll,rr);
  138.     modify(x+x+1,(l+r) shr 1+1,r,ll,rr);
  139.     ones[x]:=ones[x+x]+ones[x+x+1];
  140.     zeros[x]:=zeros[x+x]+zeros[x+x+1];
  141.   end;
  142. end;
  143.  
  144. procedure change(qs,qf:longint);
  145. var
  146.   j,jj: longint;
  147. begin
  148.   while qs <> qf do
  149.     if not h[num[pe[qs]]] then
  150.     begin
  151.       j:=num[pe[qs]];
  152.       dec(tlight,state[j]);
  153.       state[j]:=1-state[j];
  154.       inc(tlight,state[j]);
  155.       qs:=pv[qs];
  156.     end else
  157.     if head[qs] <> head[qf] then
  158.     begin
  159.       j:=num[pe[qs]];
  160.       modify(1,1,kd,pd[j],pf[dp[pd[j]]]);
  161.       qs:=head[qs];
  162.     end else
  163.     begin
  164.       j:=num[pe[qs]];
  165.       jj:=num[pe[qf]];
  166.       if (jj = 0) or (pd[jj] = 0) then modify(1,1,kd,pd[j],pf[dp[pd[j]]])
  167.       else modify(1,1,kd,pd[j],pd[jj]-1);
  168.       qs:=qf;
  169.     end;
  170. end;
  171.  
  172. begin
  173. //  assign(input,'in'); reset(input);
  174. //  assign(output,'out'); rewrite(output);
  175.   read(n,tt);
  176.   for i:=1 to n do p[i]:=i;
  177.   m:=n;
  178.   edge:=0;
  179.   for i:=1 to m do
  180.   begin
  181.     read(ss[i],ff[i]);
  182.     ss[i+m]:=ff[i];
  183.     ff[i+m]:=ss[i];
  184.     num[i+m]:=i;
  185.     num[i]:=i;
  186.     xx:=findset(ss[i]);
  187.     yy:=findset(ff[i]);
  188.     if xx = yy then edge:=i
  189.     else p[xx]:=yy;
  190.   end;
  191.   fillchar(last,sizeof(last),0);
  192.   for i:=1 to m+m do
  193.   begin
  194.     pred[i]:=last[ss[i]];
  195.     last[ss[i]]:=i;
  196.   end;
  197.   fillchar(was,sizeof(was),False);
  198.   root:=ss[edge];
  199.   pv[0]:=0; pv[root]:=0;
  200.   pe[0]:=0; pe[root]:=0;
  201.   time:=0;
  202.   rec(root);
  203.   tin[0]:=0; tout[0]:=time+1;
  204.   fillchar(good,sizeof(good),False);
  205.   fillchar(head,sizeof(head),0);
  206.   fillchar(nv,sizeof(nv),0);
  207.   good[0]:=True;
  208.   i:=ff[edge];
  209.   nv[i]:=root;
  210.   rrr:=0;
  211.   while i > 0 do
  212.   begin
  213.     good[i]:=True;
  214.     nv[pv[i]]:=i;
  215.     inc(rrr);
  216.     id[i]:=rrr;
  217.     i:=pv[i];
  218.   end;
  219.   fillchar(pp,sizeof(pp),0);
  220.   for i:=1 to n do pp[0,i]:=pv[i];
  221.   for j:=1 to 17 do
  222.     for i:=1 to n do pp[j,i]:=pp[j-1,pp[j-1,i]];
  223.   for i:=1 to n do
  224.     if good[i] then hang[i]:=i else
  225.     begin
  226.       q:=i;
  227.       for j:=17 downto 0 do
  228.         if not good[pp[j,q]] then q:=pp[j,q];
  229.       hang[i]:=pv[q];
  230.     end;
  231.   fillchar(h,sizeof(h),False);
  232.   for i:=1 to n do
  233.     if last[i] > 0 then
  234.     begin
  235.       max:=0; km:=0;
  236.       j:=last[i];
  237.       while j > 0 do
  238.       begin
  239.         if pv[ff[j]] = i then
  240.         begin
  241.           if good[ff[j]] then
  242.           begin
  243.             h[num[j]]:=True;
  244.             km:=0;
  245.             break;
  246.           end;
  247.           if sz[ff[j]] > max then
  248.           begin
  249.             max:=sz[ff[j]];
  250.             km:=j;
  251.           end;
  252.         end;
  253.         j:=pred[j];
  254.       end;
  255.       if (not good[i]) and (km > 0) then h[num[km]]:=True;
  256.     end;
  257.   fillchar(was,sizeof(was),False);
  258.   kd:=0; kp:=0;
  259.   findpath(ff[edge]);
  260.   for j:=n downto 1 do
  261.   begin
  262.     i:=ww[j];
  263.     if (i <> ff[edge]) and (h[num[pe[i]]]) and (not was[i]) then findpath(i);
  264.   end;
  265.   cntl:=-1;
  266.   for i:=1 to m do
  267.     if not h[i] then
  268.     begin
  269.       state[i]:=0;
  270.       inc(cntl);
  271.     end;
  272.   spec:=0;
  273.   tlight:=0;
  274.   fillchar(zeros,sizeof(zeros),0);
  275.   fillchar(ones,sizeof(ones),0);
  276.   build(1,1,kd);
  277.   for qq:=1 to tt do
  278.   begin
  279.     read(xx,yy);
  280.     if xx <> yy then
  281.     begin
  282.       if hang[xx] = hang[yy] then
  283.       begin
  284.         zz:=lca(xx,yy);
  285.         if xx <> zz then change(xx,zz);
  286.         if yy <> zz then change(yy,zz);
  287.       end else
  288.       begin
  289.         change(xx,hang[xx]);
  290.         change(yy,hang[yy]);
  291.         len:=id[root];
  292.         qx:=id[hang[xx]];
  293.         qy:=id[hang[yy]];
  294.         if abs(qx-qy)*2 = len then
  295.         begin
  296.           pv[root]:=ff[edge];
  297.           if nv[hang[xx]] > pv[hang[xx]] then
  298.           begin
  299.             if qx > qy then
  300.             begin
  301.               change(ff[edge],hang[yy]);
  302.               change(hang[xx],root);
  303.               spec:=1-spec;
  304.             end
  305.             else change(hang[xx],hang[yy]);
  306.           end else
  307.           begin
  308.             if qy > qx then
  309.             begin
  310.               change(ff[edge],hang[xx]);
  311.               change(hang[yy],root);
  312.               spec:=1-spec;
  313.             end
  314.             else change(hang[yy],hang[xx]);
  315.           end;
  316.         end else
  317.         if abs(qx-qy)*2 < len then
  318.         begin
  319.           if tin[hang[xx]] < tin[hang[yy]] then change(hang[yy],hang[xx])
  320.           else change(hang[xx],hang[yy]);
  321.         end else
  322.         begin
  323.           spec:=1-spec;
  324.           if qx < qy then
  325.           begin
  326.             change(ff[edge],hang[xx]);
  327.             change(hang[yy],root);
  328.           end else
  329.           begin
  330.             change(ff[edge],hang[yy]);
  331.             change(hang[xx],root);
  332.           end;
  333.         end;
  334.       end;
  335.     end;
  336.     ans:=zeros[1]+1+cntl-tlight;
  337.     if spec = 1 then
  338.       if findsum(1,1,kd,1,pf[1]) < pf[1] then dec(ans);
  339.     writeln(ans);
  340.   end;
  341.   close(input);
  342.   close(output);
  343. end.
Add Comment
Please, Sign In to add comment