結果

問題 No.875 Range Mindex Query
ユーザー otamay6otamay6
提出日時 2019-09-06 21:41:05
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
RE  
実行時間 -
コード長 1,788 bytes
コンパイル時間 1,903 ms
コンパイル使用メモリ 176,224 KB
実行使用メモリ 6,944 KB
最終ジャッジ日時 2024-06-24 17:16:53
合計ジャッジ時間 5,602 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,812 KB
testcase_01 RE -
testcase_02 AC 4 ms
6,940 KB
testcase_03 AC 2 ms
6,944 KB
testcase_04 RE -
testcase_05 RE -
testcase_06 AC 3 ms
6,944 KB
testcase_07 RE -
testcase_08 RE -
testcase_09 RE -
testcase_10 RE -
testcase_11 AC 197 ms
6,940 KB
testcase_12 AC 161 ms
5,376 KB
testcase_13 AC 138 ms
5,376 KB
testcase_14 AC 136 ms
5,376 KB
testcase_15 AC 182 ms
5,376 KB
testcase_16 AC 245 ms
5,376 KB
testcase_17 AC 266 ms
5,376 KB
testcase_18 AC 255 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
#define REP(i,n) for(int i=0,i##_len=(n);i<i##_len;++i)
#define rep(i,a,b) for(int i=int(a);i<int(b);++i)
#define All(x) (x).begin(),(x).end()
using namespace std;
template <typename T,typename E> //SegmentTree((要素数) int n_,(演算) F f,(更新) G g,(初期値) T d1)
struct SegmentTree{
  typedef function<T(T,T)> F;
  typedef function<T(T,E)> G;
  int n;
  F f;
  G g;
  T d1;
  E d0;
  vector<T> dat;
  SegmentTree(){};
  SegmentTree(int n_,F f,G g,T d1,
	      vector<T> v=vector<T>()):
    f(f),g(g),d1(d1){
    init(n_);
    if(n_==(int)v.size()) build(n_,v);
  }
  void init(int n_){
    n=1;
    while(n<n_) n*=2;
    dat.clear();
    dat.resize(2*n-1,d1);
  }
  void build(int n_, vector<T> v){
    for(int i=0;i<n_;i++) dat[i+n-1]=v[i];
    for(int i=n-2;i>=0;i--)
      dat[i]=f(dat[i*2+1],dat[i*2+2]);
  }
  void update(int k,E a){
    k+=n-1;
    dat[k]=g(dat[k],a);
    while(k>0){
      k=(k-1)/2;
      dat[k]=f(dat[k*2+1],dat[k*2+2]);
    }
  }
  inline T query(int a,int b){
    T vl=d1,vr=d1;
    int l=a+n,r=b+n;
    for(;l<r;l>>=1,r>>=1) {
      if(l&1) vl=f(vl,dat[(l++)-1]);
      if(r&1) vr=f(dat[(--r)-1],vr);
    }
    return f(vl,vr);
  }
  
};
int main(){
    int N,Q;cin>>N>>Q;
    SegmentTree<int,int> seg(N,[](int a,int b){return min(a,b);},[](int a,int b){return b;},1e9);
    vector<int> a(N),pos(N);
    REP(i, N){ 
        cin >> a[i];
        pos[a[i]]=i+1;
        seg.update(i,a[i]);
    }
    REP(i,Q){
        int query,l,r;
        cin>>query>>l>>r;
        l--;r--;
        if(query==1){
            swap(a[l],a[r]);
            swap(pos[a[l]],pos[a[r]]);
            seg.update(l,a[l]);
            seg.update(r,a[r]);
        }
        if(query==2){
            cout<<pos[seg.query(l,r+1)]<<endl;
        }
    }
}
0