117 A Elevator

問題

以下のような動きを無限に繰り返すエレベーターがある。

  • 最初は1階にいる。
  • 一秒ごとに上の階へ行く
  • 最上階についたら向きを反転する

n人の客が来る。i番目の客は時間t[i]にs[i]階に来て、f[i]階で降りたい。
このとき、それぞれの客がf[i]階に着けるのは最短でいつかを求めよ。


エレベーターは容量無限で、乗り降りにかかる時間は0である。

制約条件

n≦10^5
m≦10^8

方針

エレベーターは2*(m-1)秒周期で上り下りを繰り返す。
ので、次にエレベーターが来るのは簡単に求まる。

これに目的階と現在の階の距離を足せばいい。

ソースコード

int n,m;
void run(){
  cin>>n>>m;
  rep(i,n){
    int s,f,t; cin>>s>>f>>t;
    if(s==f){
      cout<<t<<endl; continue;
    }
    int mod=s<f?s-1:2*(m-1)-(s-1);
    t-=mod;
    if(t<0)t=0;
    else t=(t/(2*(m-1))+(t%(2*(m-1))!=0))*2*(m-1);
    t+=mod;
    t+=abs(s-f);
    cout<<t<<endl;
  }
}