@Override
 public PCMSTeamInfo getParticipant(int id) {
   for (PCMSTeamInfo team : standings) {
     if (team.getId() == id) {
       return team;
     }
   }
   return null;
 }
 @Override
 public PCMSTeamInfo getParticipantByHashTag(String hashTag) {
   for (PCMSTeamInfo teamInfo : standings) {
     if (hashTag != null && hashTag.equalsIgnoreCase(teamInfo.getHashTag())) {
       return teamInfo;
     }
   }
   return null;
 }
  public TeamInfo[] getPossibleStandings(boolean optimistic) {
    TeamInfo[] original = getStandings();

    PCMSTeamInfo[] standings = new PCMSTeamInfo[original.length];
    for (int i = 0; i < original.length; i++) {
      standings[i] = (PCMSTeamInfo) original[i].copy();
      List<RunInfo>[] runs = original[i].getRuns();
      for (int j = 0; j < problemNumber; j++) {
        int runIndex = 0;
        for (RunInfo run : runs[j]) {
          PCMSRunInfo clonedRun = new PCMSRunInfo(run);

          if (clonedRun.getResult().length() == 0) {
            clonedRun.judged = true;
            String expectedResult = optimistic ? "AC" : "WA";
            clonedRun.result = runIndex == runs[j].size() - 1 ? expectedResult : "WA";
            clonedRun.reallyUnknown = true;
          }
          standings[i].addRun(clonedRun, j);
          runIndex++;
        }
      }
    }
    for (PCMSTeamInfo team : standings) {
      team.solved = 0;
      team.penalty = 0;
      team.lastAccepted = 0;
      List<RunInfo>[] runs = team.getRuns();
      for (int j = 0; j < problemNumber; j++) {
        int wrong = 0;
        for (RunInfo run : runs[j]) {
          if ("AC".equals(run.getResult())) {
            team.solved++;
            int time = (int) (run.getTime() / 60 / 1000);
            team.penalty += wrong * 20 + time;
            team.lastAccepted = Math.max(team.lastAccepted, run.getTime());
            break;
          } else if (run.getResult().length() > 0 && !"CE".equals(run.getResult())) {
            wrong++;
          }
        }
      }
    }

    Arrays.sort(standings, TeamInfo.comparator);

    for (int i = 0; i < standings.length; i++) {
      if (i > 0 && TeamInfo.comparator.compare(standings[i - 1], standings[i]) == 0) {
        standings[i].rank = standings[i - 1].rank;
      } else {
        standings[i].rank = i + 1;
      }
    }
    return standings;
  }
 void addTeamStandings(PCMSTeamInfo teamInfo) {
   standings.add(teamInfo);
   positions.put(teamInfo.getAlias(), standings.size() - 1);
   teamNumber = standings.size();
 }