Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
37747 | LYLAKIOI | 【BJ】T2 | C++ | 运行出错 | 0 | 5978 MS | 127344 KB | 3058 | 2025-05-07 21:06:54 |
#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]); } 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){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; for(int i=sz,p=-1;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;continue;} 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),mx[0]=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[i]]%mod; else M=M*1ll*inv[mx[p]]%mod,p=stk[i]; upd(stk[i],i?(stk[i-1]-1):sz,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; }