結果
問題 |
No.3198 Monotonic Query
|
ユーザー |
|
提出日時 | 2025-07-11 21:56:21 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 244 ms / 3,000 ms |
コード長 | 3,989 bytes |
コンパイル時間 | 2,188 ms |
コンパイル使用メモリ | 201,808 KB |
実行使用メモリ | 7,296 KB |
最終ジャッジ日時 | 2025-07-12 10:54:20 |
合計ジャッジ時間 | 8,161 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
ソースコード
#ifndef INCLUDED_MAIN #define INCLUDED_MAIN #include __FILE__ int main(void) { ll q; cin>>q; segtree<ll> seg(q,op,e); ll sz=0; rep(i,q) { ll ty,x; cin>>ty>>x; if(ty==1) { seg.set(sz,x); sz++; } if(ty==2) { cout<<seg.prod(sz-x,sz)<<nl; } } } /////// library zone /////// #else #include <bits/stdc++.h> using namespace std; #define rep(i,n) for(ll i=0;i<n;i++) #define srep(i,l,r) for(ll i=l;i<=r;i++) #define irep(i,r,l) for(ll i=r;i>=l;i--) using ll = long long; using ld = long double; const ll mod=998244353; #define vout(v) for(auto i :v) cout<<i<<" "; #define INF 9223300000000000000ll #define Winf 5e12 #define nl "\n" #define all(a) a.begin(),a.end() #define rall(a) a.rbegin(),a.rend() #define vl vector<ll> #define vc vector<char> #define pb push_back ll op(ll a,ll b) {return max(a,b);} ll e() {return -Winf; } template<typename t> class segtree { function<t(t,t)> op; function<t()> e; ll n; vector<t> seg; ll siz=1; public: segtree(ll n,function<t(t,t)> op,function<t()> e) : n(n),op(op),e(e) { while(siz<n) siz*=2; seg = vector<t>(2*siz,e()); } void set(ll ind,t val) { ind+=siz; seg[ind]=val; while(ind>>=1) seg[ind]=op(seg[2*ind],seg[2*ind+1]); } t one_p(ll ind) { return seg[ind+siz]; } t prod(ll lef,ll rig) { // [l,r) lef+=siz,rig+=siz; t opl=e(),opr=e(); for(;lef<rig;lef>>=1,rig>>=1) { if(lef&1) opl=op(opl,seg[lef++]); if(rig&1) opr=op(seg[--rig],opr); } return op(opl,opr); } template<class c> ll max_right(ll lef,c judge) { ll LEF=lef+siz,wid=1; //LEF=seg列上の位置,lef=配列上のindex t ansl=e(); for(;lef+wid<=n;LEF>>=1,wid<<=1) if(LEF&1) { if(!judge(op(ansl,seg[LEF]))) break; ansl=op(ansl,seg[LEF++]); lef+=wid; } while(LEF<<=1,wid>>=1) { //if(wid==0) break; if(lef+wid<=n && judge(op(ansl,seg[LEF]))) { ansl=op(ansl,seg[LEF++]); lef+=wid; } } return lef; } template<class c> ll min_left(ll rig,c judge) { ll RIG=rig+siz,wid=1; t ansr=e(); for(;rig-wid>=0;RIG>>=1,wid<<=1) if(RIG&1) { if(!judge(op(seg[RIG-1],ansr))) break; ansr=op(seg[--RIG],ansr); rig-=wid; } while(RIG<<=1,wid>>=1) { //if(wid==0) break; if(rig-wid>=0 && judge(op(seg[RIG-1],ansr))) { ansr=op(seg[--RIG],ansr); rig-=wid; } } return rig; } }; vector<ll> Erasieve(ll n) { vector<bool> is_prime(n+1, true); is_prime[0] = is_prime[1] = false; for (int i=2;i*i<=n;++i) { if (is_prime[i]) { for (int j=i*i;j<=n;j+=i) is_prime[j] = false; } } vector<ll> primes; srep(i,2,n) { if (is_prime[i]) primes.push_back(i); } return primes; } template<typename T> bool chmin(T& a, T b){if(a > b){a = b; return true;} return false;} template<typename T> bool chmax(T& a, T b){if(a < b){a = b; return true;} return false;} void no() { cout<<"No"<<nl;} void yes() { cout<<"Yes"<<nl;} void yn(bool a) { cout<<(a ? "Yes":"No")<<nl; } ll modpow(ll fl, ll po, ll mode) { // mode: 0=modなし, 1=modあり ll ret=1; if (mode) { while (po>0) { if (po&1) ret=(ret*fl)%mod; fl=(fl*fl)%mod; po>>=1; } } else { while (po>0) { if(po&1) ret*=fl; fl*=fl; po>>=1; } } return ret; } #endif