結果
| 問題 | No.875 Range Mindex Query |
| コンテスト | |
| ユーザー |
xenon_motsu
|
| 提出日時 | 2019-09-07 12:46:50 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 210 ms / 2,000 ms |
| コード長 | 2,204 bytes |
| 記録 | |
| コンパイル時間 | 1,841 ms |
| コンパイル使用メモリ | 175,212 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-06-26 08:35:50 |
| 合計ジャッジ時間 | 4,171 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
#define fr(i,n) for(int i=0;i<(n);++i)
#define Fr(i,n) for(int i=1;i<=(n);++i)
#define ifr(i,n) for(int i=(n)-1;i>=0;--i)
#define iFr(i,n) for(int i=(n);i>0;--i)
template<class T> struct SegMIN{
int n;
T e;
vector<T> dat;
vector<int> dx;
SegMIN(vector<T>&v,T e_){
T n_=v.size();e=e_;
n=1;
while(n<n_) n*=2;
T n1=n-1,n2=n+n1,N=n1+n_;
dat.resize(n2,e);dx.resize(n2);
for(int i=n1;i<N;++i) dat[i]=v[i-n1],dx[i]=i;
for(int i=N;i<n2;++i) dat[i]=e_,dx[i]=i;
ifr(i,n1){
int l=2*i+1,r=2*i+2;
if(dat[l]>dat[r]) dat[i]=dat[r],dx[i]=dx[r];
else dat[i]=dat[l],dx[i]=dx[l];
}
}
void ud(int k,T c){
k+=n-1;
dat[k]=c;
while(k>0){
k=(k-1)/2;
int l=2*k+1,r=2*k+2;
if(dat[l]>dat[r]) dat[k]=dat[r],dx[k]=dx[r];
else dat[k]=dat[l],dx[k]=dx[l];
}
}
T mn(int be,int en,int k,int l,int r){
if(r<=be||en<=l) return e;
if(be<=l&&r<=en) return dat[k];
return min(mn(be,en,k*2+1,l,(l+r)/2),mn(be,en,k*2+2,(l+r)/2,r));
}
T mn(int be,int en){
return mn(be,en,0,0,n);
}
int mnd(int be,int en,int k,int l,int r){
if(r<=be||en<=l) return -1;
if(be<=l&&r<=en) return dx[k];
int L=mnd(be,en,k*2+1,l,(l+r)/2),R=mnd(be,en,k*2+2,(l+r)/2,r);
if(L<0) return R;
if(R<0) return L;
if(dat[L]>dat[R]) return R;
else return L;
}
int mnd(int be,int en){
return mnd(be,en,0,0,n)-n+1;
}
T getv(int k){
return dat[k+n-1];
}
};
int main(){
cin.tie(nullptr);
ios::sync_with_stdio(false);
istream& in(cin);
ostream& out(cout);
int n,q,l,r;
uint_fast8_t f;
in>>n>>q;
vector<int> a(n);
for(auto&i:a) in>>i;
SegMIN<int> seg(a,n+1);
fr(i,q){
in>>f>>l>>r;
--l;
if(f&1u){
--r;
swap(a[l],a[r]);
seg.ud(l,a[l]);
seg.ud(r,a[r]);
}
else{
out<<seg.mnd(l,r)+1<<endl;
}
}
}
xenon_motsu