結果
問題 | No.3122 Median of Medians of Division |
ユーザー |
|
提出日時 | 2025-04-20 19:56:44 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 751 ms / 2,000 ms |
コード長 | 1,311 bytes |
コンパイル時間 | 8,124 ms |
コンパイル使用メモリ | 356,228 KB |
実行使用メモリ | 9,796 KB |
最終ジャッジ日時 | 2025-04-20 19:57:18 |
合計ジャッジ時間 | 33,997 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 40 |
ソースコード
#pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include<bits/stdc++.h> #include<atcoder/all> using namespace std; using namespace atcoder; using ll=long long; using mint=modint998244353; const ll inf=(1e9+7)*(1e9+7); int dx[4]={1,0,0,-1},dy[4]={0,1,-1,0}; const int mod=998244353; using P=pair<int,int>; P op(P a,P b){ P c={0,0}; if(a.first>=b.first){ c.first=a.first; c.second=max(a.second,b.first); }else{ c.first=b.first; c.second=max(b.second,a.first); } return c; } P e(){ return{0,0}; } int main(){ int n,q; cin>>n>>q; vector<int>a(n); for(int i=0;i<n;i++) cin>>a[i]; vector<P>b(n-1); for(int i=0;i<n-1;i++) b[i]={min(a[i],a[i+1]),0}; segtree<P,op,e>seg(b); int query,i,x,l,r; while(cin>>query){ if(query==1){ cin>>i>>x; i--; a[i]=x; if(i!=0) seg.set(i-1,{min(a[i-1],a[i]),0}); if(i!=n-1) seg.set(i,{min(a[i],a[i+1]),0}); } if(query==2){ cin>>l>>r; l--; if(r-l==1){ cout<<a[l]<<endl; continue; } int ok=1,ng=1e9+1; while(ng-ok>1){ int mid=(ok+ng)/2; P p=seg.prod(l,r-1); int cnt=0; if(p.first>=mid) cnt++; if(p.second>=mid) cnt++; if(a[l]>=mid) cnt++; if(a[r-1]>=mid) cnt++; if(cnt>=2) ok=mid; else ng=mid; } cout<<ok<<endl; } } }