Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
37748 LYLAKIOI 【BJ】T2 C++ 通过 100 1374 MS 44868 KB 3132 2025-05-07 21:38:00

Tests(60/60):


#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=2e5+10,mod=998244353; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int t,n,m,q; inline int add(int a,int b){if((a+=b)>=mod)a-=mod;return a;} struct ds { int bel[maxn],sum[maxn],lz1[maxn],lz2[maxn],len; void init(){ len=sqrt(n);up(i,1,n)bel[i]=(i-1)/len+1,lz1[i]=lz2[i]=0; } void upd(int l,int r,int x){ if(bel[l]==bel[r]){ sum[bel[l]]=add(sum[bel[l]],(r-l+1)*1ll*x%mod); lz1[l]=add(lz1[l],x); if(bel[r]==bel[r+1])lz1[r+1]=add(lz1[r+1],mod-x); }else { upd(l,bel[l]*len,x),upd((bel[r]-1)*len+1,r,x); if(bel[l]+1<=bel[r]-1)lz2[bel[l]+1]=add(lz2[bel[l]+1],x),lz2[bel[r]]=add(lz2[bel[r]],mod-x); } } int ask(int p){ int res=0,s=0; up(i,1,bel[p]-1){ s=add(s,lz2[i]); res=add(res,s*1ll*len%mod); res=add(res,sum[i]); } s=add(s,lz2[bel[p]]); up(i,(bel[p]-1)*len+1,p){ s=add(s,lz1[i]); res=add(res,s); } return res; } }T1,T2; int sz; void upd(int l,int r,int x){ T1.upd(sz-r+1,sz-l+1,x); T2.upd(n-r+1,n-l+1,x); } int ask(int x){if(x>sz)return 0;return add(T1.ask(x),mod-T2.ask(n-(sz-x+1)));} int mx[maxn],val[maxn],pre[maxn],nxt[maxn],a[maxn],vis[maxn]; const int N=1e7+10; int inv[N]; void init(){ inv[1]=1;up(i,2,N-10)inv[i]=mod-inv[mod%i]*1ll*(mod/i)%mod; } priority_queue<int,vector<int>,greater<int> >Q; void ins(int x){ Q.push(x); if(Q.size()>m)Q.pop(); a[++sz]=x;mx[sz]=a[sz];pre[sz]=sz-1,nxt[sz-1]=sz; vector<int>stk;bool tag=0;int p=-1; for(int i=sz;i;i=pre[i]){ stk.p_b(i); if(stk.size()<=m)mx[i]=min(mx[i],x); else { if(p!=-1)mx[p]=min(mx[i],x); if(mx[i]>x){tag=1;break;} if(mx[i]==a[i]){pre[nxt[i]]=pre[i],nxt[pre[i]]=nxt[i],vis[i]=1;continue;} p=i; } } if(!tag){ stk.p_b(0);if(p!=-1)mx[p]=Q.top(); } int M=1; for(int i=0,p=-1;i+1<stk.size();i++){ M=M*1ll*a[stk[i]]%mod; if(i<m)p=stk[i]; else if(vis[stk[i]])M=M*1ll*inv[a[stk[i]]]%mod; else M=M*1ll*inv[mx[p]]%mod,p=stk[i]; upd(stk[i+1]+1,stk[i],add(M,mod-val[stk[i]])); val[stk[i]]=M; } } void slv(){init(); t=read(),n=read(),m=read(),q=read(); T1.init(),T2.init(); int lst=0; while(q--){ int op=read(),x=read()^(t*lst); if(op==1)ins(x); else printf("%d\n",lst=ask(x)); } } int main(){ //freopen("street.in","r",stdin),freopen("street.out","w",stdout); slv(); return 0; }


测评信息: