AtCoder Beginner Contest 250で失敗しました

AtCoder Beginner Contestでまた大失敗をしました。

失敗したのはC問題です。
C.
こういう、データ構造作ってみよう的な問題で、考察が深まる前に突っ走ってしまうため、実装がごちゃごちゃして失敗することよくあるんですよね...
C問題に時間をかけすぎたせいで時間内ACはできませんでしたが、D問題の方が得意だったりします...
D.
 
というかD問題、終了3分後に解けたんですよね...悔しい...
めちゃくちゃ悔しかったので、C問題のような問題で使えるデータ構造を作って、ライブラリに入れておこうと思い、作ってみました。
struct multi_list{
 vector<int> list;
 vector<int> cont;
  multi_list(int n,int m) : list(n),cont(n) {
  if(m==0) {
   for(int i=0;i<n;i++){
    list[i] = i;
    cont[i] = i;
   }
  }
 }
 void cont_swap(int a,int b){
  swap(list[cont[a]],list[cont[b]]);
  swap(cont[a],cont[b]);
  }
  void idx_swap(int i,int j){
   int a,b;
   a = list[i];b = list[j];
   swap(list[i],list[j]);
   swap(cont[a],cont[b]);
  }
  void print(){
  for(int i=0;i<list.size();i++){
    cout << list[i]+1 << " ";
  }
  cout << endl;
 }
 void sort(){
  std::sort(list.begin(),list.end());
   for(int i=0;i<list.size();i++) cont[list[i]] = i;
 }
};
リストの要素から指定して、要素にアクセスできる、swapできる構造です。というか、C問題ほとんどそのままですね...
正直、実用性は皆無ですが、次似たような問題が出たら、爆速でできるようにしておきたいと思います。