codeforces #35 div2

PM4時から始まった#35とその後7時からの#36の両方に参加しましたが、#35は1問、#36に至っては0問という散々な結果だったので、#35についてだけ。
http://www.codeforces.com/contest/35
入出力がいつもと違いファイル形式だったので、それに手間取って時間ロスしてしまいました。

A問題

3つのコップのうち、ひとつにボールを入れた後、コップを3回入れ替えたときにどのコップにボールが入っているかを答える問題です。
ボールが入っているコップの数字を記憶しておき、入力にその数字が存在したらもう片方に入れ替えるやり方でやりました。

int main(void){
  ifstream infile("input.txt");
  ofstream outfile("output.txt"); 
  int ball;
  infile>>ball;
  int s1,s2;
  for(int i=0; i<3; i++){
    infile>>s1>>s2;
    if(s1==ball){
      ball=s2;
    }else if(s2==ball){
      ball=s1;
    }
  }
  outfile<<ball<<endl;
  return 0;
}

B問題

Aを解いた後、先にC問題に手をつけたのがダメだったみたい。結局Cはシステムテストで落ちてしまいました。B問題はあと10分あったら通ってた。英語は結構長くて読みにくい文ですが、エキサイト翻訳にかけると大体理解できます。倉庫に何かを入れたり取り出したりするらしい。急いでソースコードを書いたので、とても汚くなってますが、改善するのも面倒なのでそのまま貼り付けることにします。
コード中のPはtypedefでpairを置き換えたものです。

int n,m,k;
bool full[30][30];
map<string, P> mp;
P find(int x, int y){
  for(int j=y; j<m; j++){
    if(!full[x][j]){
      full[x][j]=true;
      return P(x,j);
    }
  }
  for(int i=x+1;i<n;i++){
    for(int j=0;j<m;j++){
      if(!full[i][j]){
        full[i][j]=true;
        return P(i,j);
      }
    }
  }
  return P(-1,-1);
}

int main(void){
  ifstream infile("input.txt");
  ofstream outfile("output.txt"); 
  infile>>n>>m>>k;
  set<string> nameset;
  int count=0;
  REP(i,k){
    string pl;
    int x,y;
    string name;
    infile>>pl;
    if(pl=="+1"){
      infile>>x>>y>>name;
      P point = find(x-1,y-1);
      if(point.first==-1) continue;
      mp.insert(pair<string, P>(name,point));
      nameset.insert(name);
    }else{
      infile>>name;
      if(nameset.find(name)==nameset.end()){
        outfile<<"-1 -1"<<endl;
      }else{
      P point = mp[name];
      int x=point.first;
      int y=point.second;
      full[x][y]=false;
      mp.erase(name);
      nameset.erase(name);
      outfile<<x+1<<" "<<y+1<<endl;
      }
    }
  }
  return 0;
}