結果
| 問題 |
No.875 Range Mindex Query
|
| コンテスト | |
| ユーザー |
xenon_motsu
|
| 提出日時 | 2019-09-07 14:00:00 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 200 ms / 2,000 ms |
| コード長 | 1,958 bytes |
| コンパイル時間 | 1,943 ms |
| コンパイル使用メモリ | 177,880 KB |
| 実行使用メモリ | 5,632 KB |
| 最終ジャッジ日時 | 2024-06-26 09:39:36 |
| 合計ジャッジ時間 | 4,180 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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 SegMIND{
int n,n1;
T e;
vector<T> dat;
vector<int> dx;
SegMIND(vector<T>&v,T e_){
T n_=v.size();e=e_;
n=1;
while(n<n_) n<<=1;
n1=n-1;
int n2=n+n1,N=n1+n_;;dx.resize(n2);
dat=v;
dat.resize(n,e);
for(int i=n1;i<n2;++i) dx[i]=i-n1;
ifr(i,n1){
int l=(i<<1)+1,r=(i<<1)+2;
if(dat[dx[l]]>dat[dx[r]]) dx[i]=dx[r];
else dx[i]=dx[l];
}
}
void ud(int k,T c){
dat[k]=c;
k+=n-1;
while(k>0){
k=(k-1)>>1;
int l=(k<<1)+1,r=(k<<1)+2;
if(dat[dx[l]]>dat[dx[r]]) dx[k]=dx[r];
else dx[k]=dx[l];
}
}
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<<1)+1,l,(l+r)>>1),R=mnd(be,en,(k<<1)+2,(l+r)>>1,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);
}
T mn(int be,int en){
return dat[mnd(be,en,0,0,n)];
}
T getv(int k){
return dat[k];
}
};
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;
SegMIND<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