結果

問題 No.875 Range Mindex Query
ユーザー itsuteiitsutei
提出日時 2021-09-09 13:19:00
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 2,039 bytes
コンパイル時間 2,289 ms
コンパイル使用メモリ 205,960 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-06-09 12:53:28
合計ジャッジ時間 5,132 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 WA -
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using P = pair<ll,ll>;

template<typename T> struct Segtree{
  const T unit = 1e9; //変える
  int n;
  vector<T> node;
  
  Segtree(int n,T val) : Segtree(vector(n,val)){}
  Segtree(vector<T> data) : n( 1<<(int)ceil( log2(data.size()) ) ), node(n*2, unit){
    
    int sz = data.size();
    for(int i=0; i<sz; i++){
      node[n+i] = data[i];
    }
    for(int i=n-1; i>0; i--){
      node[i] = comp( node[i*2],node[i*2+1] );
    }
  }
  
  T comp(const T &a, const T &b){
    return min(a,b); //変える
  }
  T find(int l, int r){ //[l,r)!!
    T x = unit, y = unit;
    l += n; r += n;
    while(l<r){
      if(l&1) x = comp(x,node[l++]);
      if(r&1) y = comp(node[--r],y);
      l>>=1; r>>=1;
    }
    return comp(x,y);
  }
  void update(int i, T v){
    i += n;
    node[i] = v;
    while((i/=2) > 0){
      node[i] = comp( node[i*2],node[i*2+1] );
    }
  }
  void add(int i,T val){
    update(i,node[i+n]+val);
  }
  
  int find_l(int a,int b,T x,int k=1,int l=0,int r=-1){
    if(r<0) r = n;
    if (!f(k,x) || r<=a || b<=l) return b;
    else if (k>=n) return k-n;
    else{
      int vl = find_l(a,b,x,2*k,l,(l+r)/2);
      if (vl != b) return vl;
      else return find_l(a,b,x,2*k+1,(l+r)/2,r);
    }
  }
  int find_r(int a,int b,T x,int k=1,int l=0,int r=-1){
    if(r<0) r = n;
    if (!f(k,x) || r<=a || b<=l) return a-1;
    else if (k>=n) return k-n;
    else{
      int vr = find_r(a,b,x,2*k+1,(l+r)/2,r);
      if (vr != a-1) return vr;
      else return find_r(a,b,x,2*k,l,(l+r)/2);
    }
  }
  bool f(int k, T x){
    return node[k] == x;
  }
};


int main(){
  
  int n,q; cin>>n>>q;
  vector<int>a(n);
  for(auto &i:a)cin>>i;
  
  Segtree sg(a);
  
  while(q--){
    
    int t,l,r; cin>>t>>l>>r;
    --l; --r;
    if(t==1){
      int b = sg.find(l,l+1);
      int c = sg.find(r,r+1);
      sg.update(l,c);
      sg.update(r,b);
    }
    else{
      int v = sg.find(l,r+1);
      int s = sg.find_l(0,n,v);
      cout<<s+1<<'\n';
    }
  }
}
0