競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 196E

ABC196E

clamp 関数の合成 は clamp 関数になる.

関数をそのまま持たずに,必要な情報にそぎ落とす. 今回の clamp 関数では,組 \( (s,l,r) \) を持っておけば 関数が復元できる. ここで,clamp 関数において, 全体を \(+s\) シフトする, 下限が \(l\), 上限が \(r\) とする.

実装
\(+a\) シフトするとき,\(l,r\) も同時に \(+a\) シフトする.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"

int main(){
  ll n, m ;
  cin >> n;

  ll l = -INFL; // rem : -INFL
  ll r = INFL;
  ll s = 0;
  rep(i,n){
    ll a,t; cin >> a >> t;

    if(t == 1){
      s += a;
      l += a;
      r += a;
    }

    if(t == 2){
      chmax(l, a);
      chmax(r, a);
    }

    if(t == 3){
      chmin(l, a);
      chmin(r, a);
    }

  }



  ll q; cin >> q;
  rep(qi,q){
    ll x; cin >> x;

    cout << clamp(x+s,l,r) << endl; // c++17

  }

  return 0;
}