import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Scanner; import java.util.ArrayList; public class Main{ static HashMap<Double,Integer> buy=new HashMap<Double,Integer>(5000); static HashMap<Double,Integer> sell=new HashMap<Double,Integer>(5000); static ArrayList<trade> Nbuy=new ArrayList<trade>(5000); static ArrayList<trade> Nsell=new ArrayList<trade>(5000); static String inputrecord[]=new String[5001]; static boolean youxiao[]=new boolean[5001]; public static void main(String[] args){ Scanner in=new Scanner(System.in); int index=1; while(in.hasNext()){ inputrecord[index]=in.nextLine(); youxiao[index]=true; //if(inputrecord[index].equals("f"))break; index++; } in.close(); int indexbuy=0,indexsell=0; double sumbuy=0,sumsell=0; for(int i=index-1;i>0;i--){ if(youxiao[i]==true){ String[] input=inputrecord[i].split(" "); if(input[0].equals("cancel")){ int nx=Integer.parseInt(input[1]);//yingshe dao child line while(true){ String te[]=inputrecord[nx].split(" ");//child line data if(!te[0].equals("cancel")){ if(youxiao[nx]==true){ youxiao[nx]=false; break; } else break; } else{ if(youxiao[nx]==true){ youxiao[nx]=false; nx=Integer.parseInt(te[1]); } else break; } } }else{ double price=Double.parseDouble(input[1]); double num=Double.parseDouble(input[2]); if(input[0].equals("buy")){ sumbuy+=num; if(buy.containsKey(price)){ int ind=buy.get(price); Nbuy.set( ind,new trade(price,Nbuy.get(ind).num+num) ); }else{ Nbuy.add(indexbuy,new trade(price,num) ); indexbuy++; } }else{ sumsell+=num; if(sell.containsKey(price)){ int ind=sell.get(price); Nsell.set( ind,new trade(price,Nsell.get(ind).num+num) ); }else{ Nsell.add(indexsell,new trade(price,num) ); indexsell++; } } } } } Comparator<trade> comparator=new Comparator<trade>(){ public int compare(trade s1,trade s2){ return (s1.price>s2.price)?1:(s1.price==s2.price?0:-1); } }; Collections.sort(Nbuy,comparator); Collections.sort(Nsell,comparator); double less=0,above=sumbuy; //above==bigger and equals //less== smaller for(int i=0;i<Nbuy.size();i++){ Nbuy.get(i).less=less; Nbuy.get(i).above=above; less+=Nbuy.get(i).num; above-=Nbuy.get(i).num; } //above==bigger //less== smaller and equals less=0; above=sumsell; for(int i=0;i<Nsell.size();i++){ less+=Nsell.get(i).num; above-=Nsell.get(i).num; Nsell.get(i).less=less; Nsell.get(i).above=above; } double dealnum=0; double dealprice=0; for(int i=0,j=0;i<Nbuy.size();i++){ while(true){ if(Nbuy.get(i).price>=Nsell.get(j).price){ if(Math.min(Nbuy.get(i).above, Nsell.get(j).less)>dealnum){ dealprice=Nbuy.get(i).price; dealnum=Math.min(Nbuy.get(i).above, Nsell.get(j).less); }else if(Math.min(Nbuy.get(i).above, Nsell.get(j).less)==dealnum){ if(Nbuy.get(i).price>dealprice){ dealprice=Nbuy.get(i).price; } } if(j<Nsell.size()-1)j++; else break; }else break; } } if(Nbuy.size()==0&&Nsell.size()==0){ System.out.printf("%.2f %.0f",0.0,dealnum); return; } if(Nbuy.size()==0){ System.out.printf("%.2f %.0f",Nsell.get(Nsell.size()-1).price,dealnum); return; } if(Nsell.size()==0){ System.out.printf("%.2f %.0f",Nbuy.get(Nbuy.size()-1).price,dealnum); return; } if(dealprice==0)System.out.printf("%.2f %.0f",Math.max(Nbuy.get(Nbuy.size()-1).price, Nsell.get(Nsell.size()-1).price),dealnum); else System.out.printf("%.2f %.0f",dealprice,dealnum); } } class trade{ double price=0; double num=0; double less=0; double above=0; public trade(double price,double num){ this.price=price; this.num=num; } }
