Submission #894342

#TimeUsernameProblemLanguageResultExecution timeMemory
894342zeta7532Weighting stones (IZhO11_stones)C++17
100 / 100
223 ms7872 KiB
#include <bits/stdc++.h> #pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") using namespace std; using ll = int; const ll mod = 998244353; #define fi first #define se second #define rep(i,n) for(ll i=0;i<n;i++) #define all(x) x.begin(),x.end() #define faster ios::sync_with_stdio(false);cin.tie(nullptr) template <typename T> struct RMQmax{ const T INF=0; ll N; vector<T> dat,lazy; RMQmax(ll N_):N(),dat(N_*4,0),lazy(N_*4,INF){ ll x=1; while(N_>x) x*=2; N=x; } void eval(ll k,ll l,ll r){ if(lazy[k]==0) return; if(k<N-1){ lazy[k*2+1]+=lazy[k]; lazy[k*2+2]+=lazy[k]; } dat[k]+=lazy[k]; lazy[k]=0; } void update(ll a,ll b,T x,ll k,ll l,ll r){ eval(k,l,r); if(a<=l&&r<=b){ lazy[k]+=x; eval(k,l,r); }else if(a<r&&l<b){ update(a,b,x,k*2+1,l,(l+r)/2); update(a,b,x,k*2+2,(l+r)/2,r); dat[k]=max(dat[k*2+1],dat[k*2+2]); } } void update(ll a,ll b,T x){update(a,b,x,0,0,N);} T query_sub(ll a,ll b,ll k,ll l,ll r){ eval(k,l,r); if(r<=a||b<=l){ return -1e9; }else if(a<=l&&r<=b){ return dat[k]; }else{ T vl=query_sub(a,b,k*2+1,l,(l+r)/2); T vr=query_sub(a,b,k*2+2,(l+r)/2,r); return max(vl,vr); } } T query(ll a,ll b){return query_sub(a,b,0,0,N);} }; template <typename T> struct RMQmin{ const T INF=0; ll N; vector<T> dat,lazy; RMQmin(ll N_):N(),dat(N_*4,0),lazy(N_*4,INF){ ll x=1; while(N_>x) x*=2; N=x; } void eval(ll k,ll l,ll r){ if(lazy[k]==0) return; if(k<N-1){ lazy[k*2+1]+=lazy[k]; lazy[k*2+2]+=lazy[k]; } dat[k]+=lazy[k]; lazy[k]=0; } void update(ll a,ll b,T x,ll k,ll l,ll r){ eval(k,l,r); if(a<=l&&r<=b){ lazy[k]+=x; eval(k,l,r); }else if(a<r&&l<b){ update(a,b,x,k*2+1,l,(l+r)/2); update(a,b,x,k*2+2,(l+r)/2,r); dat[k]=min(dat[k*2+1],dat[k*2+2]); } } void update(ll a,ll b,T x){update(a,b,x,0,0,N);} T query_sub(ll a,ll b,ll k,ll l,ll r){ eval(k,l,r); if(r<=a||b<=l){ return 1e9; }else if(a<=l&&r<=b){ return dat[k]; }else{ T vl=query_sub(a,b,k*2+1,l,(l+r)/2); T vr=query_sub(a,b,k*2+2,(l+r)/2,r); return min(vl,vr); } } T query(ll a,ll b){return query_sub(a,b,0,0,N);} }; int main() { ll N; cin >> N; RMQmin<ll> segmin(N); RMQmax<ll> segmax(N); rep(i,N){ ll R,S; cin >> R >> S; if(S==1) segmin.update(0,R,1),segmax.update(0,R,1); if(S==2) segmin.update(0,R,-1),segmax.update(0,R,-1); ll valmin=segmin.query(0,N),valmax=segmax.query(0,N); if(0<=valmin) cout << '>' << endl; if(valmax<=0) cout << '<' << endl; if(valmin<0&&0<valmax) cout << '?' << endl; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...