//A###......
//で連続する部分列のうち長さiで最小なもの
vector<int> argmin_subseq(vector<int> A){
  const int mi=numeric_limits<int>::min();
  int N=A.size(),mx=mi;
  vector<int> idx,nx;
  for(int i=0;i<N;i++){
    A[i]*=-1;
    mx=max(mx,A[i]);
  }
  for(int i=0;i<N;i++){
    A[i]-=mx-1;
    if(A[i]==1){idx.push_back(i);}
  }
  for(int len=1;len<N;){
    for(auto I:idx){
      mx=max(mx,I+len<N?A[I+len]:mi);
    }
   if(mx<=0){
      for(auto I:idx){
        if((I+len<N?A[I+len]:mi)==mx){
          A[I]++;
          nx.push_back(I);
        }
      }
      len++;
    }
    else{
      reverse(idx.begin(),idx.end());
      for(auto I:idx){
        if(I+len<N && A[I+len]>0){
          A[I]+=A[I+len];
          mx=max(mx,A[I]);
        }
      }
      reverse(idx.begin(),idx.end());
      for(auto I:idx){
        if(A[I]==mx){nx.push_back(I);}
      }
      len=mx;
    }
    idx.clear();
    swap(nx,idx);
  }
  for(auto &I:A){I=max(I,0);}
  return A;
}