結果
| 問題 | 
                            No.3116 More and more teleporter
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2025-04-18 22:34:54 | 
| 言語 | Rust  (1.83.0 + proconio)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 114 ms / 2,000 ms | 
| コード長 | 2,548 bytes | 
| コンパイル時間 | 15,599 ms | 
| コンパイル使用メモリ | 388,908 KB | 
| 実行使用メモリ | 33,252 KB | 
| 最終ジャッジ日時 | 2025-04-18 22:35:12 | 
| 合計ジャッジ時間 | 18,370 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 22 | 
ソースコード
#![allow(unused_imports,non_snake_case,dead_code)]
use std::{cmp::Reverse as Rev,collections::*,iter::*};
use proconio::{marker::*,*};
#[fastout]
fn main(){
    input!{
        n:usize,
        q:usize,
    }
    let mut qs=(0..q).map(|i|{
        let time=i+1;
        input!{t:usize}
        if t==1{
            input!{x:Usize1}
            Q{time,x,c:-1}
        } else{
            input!{x:Usize1,c:i64}
            Q{time,x,c}
        }
    }).collect::<Vec<_>>();
    qs.insert(0,Q{time:0,x:0,c:0});
    const INF:i64=i64::MAX/64;
    let mut ans=vec![INF;qs.len()];
    let mut todo=vec![vec![];n];
    let mut add=vec![vec![];n];
    for i in 0..qs.len(){
        if qs[i].c==-1{
            todo[qs[i].x].push(qs[i]);
        } else{
            add[qs[i].x].push(qs[i]);
        }
    }
    let mut set=BTreeMap::<usize,i64>::new();
    let mut rem=vec![];
    for i in 0..n{
        'a: for &Q{time,x,c} in &add[i]{
            let new=c-x as i64;
            if let Some((_,&pc))=set.range(..=time).rev().next(){
                if pc<=new{
                    continue 'a;
                }
            }
            rem.clear();
            for (&pt,&pc) in set.range(time..){
                if new<=pc{
                    rem.push(pt);
                }
            }
            for &t in &rem{
                set.remove(&t);
            }
            set.insert(time,new);
        }
        for &Q{time,x,..} in &todo[i]{
            if let Some((_,&nc))=set.range(..=time).rev().next(){
                ans[time]=ans[time].min(nc+x as i64);
            }
        }
    }
    set.clear();
    for i in (0..n).rev(){
        'a: for &Q{time,x,c} in &add[i]{
            let new=c-(n-x) as i64;
            if let Some((_,&pc))=set.range(..=time).rev().next(){
                if pc<=new{
                    continue 'a;
                }
            }
            rem.clear();
            for (&pt,&pc) in set.range(time..){
                if new<=pc{
                    rem.push(pt);
                }
            }
            for &t in &rem{
                set.remove(&t);
            }
            set.insert(time,new);
        }
        for &Q{time,x,..} in &todo[i]{
            if let Some((_,&nc))=set.range(..=time).rev().next(){
                ans[time]=ans[time].min(nc+(n-x) as i64);
            }
        }
    }
    for i in 0..qs.len(){
        if qs[i].c==-1{
            println!("{}",ans[i]);
        }
    }
}
#[derive(Clone,Copy)]
struct Q{
    time:usize,
    x:usize,
    c:i64,
}