結果
| 問題 |
No.875 Range Mindex Query
|
| コンテスト | |
| ユーザー |
rniya
|
| 提出日時 | 2020-03-03 10:21:23 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 71 ms / 2,000 ms |
| コード長 | 1,578 bytes |
| コンパイル時間 | 1,568 ms |
| コンパイル使用メモリ | 173,372 KB |
| 実行使用メモリ | 6,528 KB |
| 最終ジャッジ日時 | 2024-10-13 21:53:21 |
| 合計ジャッジ時間 | 3,766 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
template<typename Monoid>
struct SegmentTree{
typedef function<Monoid(Monoid,Monoid)> F;
int n;
F f;
Monoid id;
vector<Monoid> dat;
SegmentTree(int n_,F f,Monoid id):f(f),id(id){init(n_);}
void init(int n_){
n=1;
while(n<n_) n<<=1;
dat.assign(n<<1,id);
}
void build(const vector<Monoid> &v){
for (int i=0;i<v.size();++i) dat[i+n]=v[i];
for (int i=n-1;i;--i) dat[i]=f(dat[i<<1|0],dat[i<<1|1]);
}
void update(int k,Monoid x){
dat[k+=n]=x;
while(k>>=1) dat[k]=f(dat[k<<1|0],dat[k<<1|1]);
}
Monoid query(int a,int b){
if (a>=b) return id;
Monoid vl=id,vr=id;
for (int l=a+n,r=b+n;l<r;l>>=1,r>>=1){
if (l&1) vl=f(vl,dat[l++]);
if (r&1) vr=f(dat[--r],vr);
}
return f(vl,vr);
}
Monoid operator[](int i){
return dat[i+n];
}
};
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
int N,Q; cin >> N >> Q;
vector<int> a(N);
for (int i=0;i<N;++i) cin >> a[i];
struct node{int n,id;};
auto f=[](node a,node b){return (a.n<b.n?a:b);};
SegmentTree<node> seg(N,f,node{N,0});
vector<node> v(N);
for (int i=0;i<N;++i) v[i]={a[i]-1,i+1};
seg.build(v);
for (;Q--;){
int c,l,r; cin >> c >> l >> r; --l,--r;
if (c==1){
int L=seg[l].n,R=seg[r].n;
seg.update(l,node{R,l+1});
seg.update(r,node{L,r+1});
} else cout << seg.query(l,r+1).id << '\n';
}
}
rniya