| Run ID | 作者 | 问题 | 语言 | 测评结果 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|
| 91640 | sh25_shenpy | 树状数组 | C++ | 通过 | 1417 MS | 207096 KB | 2321 | 2026-06-14 13:44:50 |
#include<set> #include<map> #include<queue> #include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> #define R register #define ll long long using namespace std; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();} return x*f; } const int N = 1e5 + 1000,mod = 998244353; int n,T,cnt; int rt[(N << 2) + 1000]; struct node{int ls,rs,v;} tr[N * 400]; ll ksm(ll x,ll y){ll res = 1; for(;y;y >>= 1,x = x * x % mod) if(y & 1) res = res * x % mod; return res;} ll mul(ll p,ll q){ll res = p * q % mod; res = (res + (1 - p) * (1 - q) % mod) % mod; return (res + mod) % mod;} void changey(int &k,int l,int r,int x,int y,ll p) { if(!k){k = ++ cnt; tr[k].v = 1;} if(x <= l && y >= r) {tr[k].v = mul(tr[k].v,p); return;} int mid = (l + r) >> 1; if(x <= mid) changey(tr[k].ls,l,mid,x,y,p); if(y > mid) changey(tr[k].rs,mid + 1,r,x,y,p); } void changex(int k,int l,int r,int lx,int rx,int ly,int ry,ll p) { if(lx <= l && rx >= r){changey(rt[k],1,n,ly,ry,p); return ;} int mid = (l + r) >> 1; if(lx <= mid) changex(k << 1,l,mid,lx,rx,ly,ry,p); if(rx > mid) changex(k << 1 | 1,mid + 1,r,lx,rx,ly,ry,p); } ll asky(int k,int l,int r,int pos) { if(!k) return 1; if(l == r) return tr[k].v; int mid = (l + r) >> 1; if(pos <= mid) return mul(tr[k].v,asky(tr[k].ls,l,mid,pos)); else return mul(tr[k].v,asky(tr[k].rs,mid + 1,r,pos)); } ll askx(int k,int l,int r,int posx,int posy) { if(l == r) return asky(rt[k],1,n,posy); int mid = (l + r) >> 1; if(posx <= mid) return mul(askx(k << 1,l,mid,posx,posy),asky(rt[k],1,n,posy)); else return mul(askx(k << 1 | 1,mid + 1,r,posx,posy),asky(rt[k],1,n,posy)); } int main() { n = read(); T = read(); ll p; int opt,l,r; while(T --) { opt = read(); l = read(); r = read(); if(opt == 1) { p = ksm(r - l + 1,mod - 2); if(l > 1) changex(1,0,n,1,l - 1,l,r,(1 - p + mod) % mod),changex(1,0,n,0,0,1,l - 1,0); if(r < n) changex(1,0,n,l,r,r + 1,n,(1 - p + mod) % mod),changex(1,0,n,0,0,r + 1,n,0); changex(1,0,n,l,r,l,r,(1 - 2ll * p + mod) % mod); changex(1,0,n,0,0,l,r,p); } else cout << askx(1,0,n,l - 1,r) << "\n"; } return 0; }