1 solutions

  • 0
    @ 2025-11-5 18:07:08

    C++ :

    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    struct atom{
    	int x,y;
    	void scan(){
    		scanf("%d%d",&x,&y);
    	}
    }ans[110000],num[410000];
    const int mo=998244353;
    atom operator + (atom k1,atom k2){
    	return (atom){(1ll*k1.x*k2.x+1ll*k1.y*k2.y)%mo,(1ll*k1.x*k2.y+1ll*k1.y*k2.x)%mo};
    }
    int quick(int k1,int k2){
    	int k3=1;
    	while (k2){
    		if (k2&1) k3=1ll*k3*k1%mo;
    		k1=1ll*k1*k1%mo; k2>>=1;
    	}
    	return k3;
    }
    struct ask{
    	int where,pd,l,r;
    	atom w0,w1;
    	void scan(int x){
    		where=x;
    		scanf("%d%d%d",&pd,&l,&r);
    		if (pd==2) l--;
    		int k1=quick(r-l+1,mo-2);
    		w0=(atom){(1-k1+mo)%mo,k1};
    		k1=k1*2%mo;
    		w1=(atom){(1-k1+mo)%mo,k1};
    	}
    }q[110000];
    int n,m,a[110000],len;
    void clear(int k1,int k2,int k3,int k4){
    	num[k1]=(atom){1,0};
    	if (k2==k3) return;
    	int mid=k2+k3>>1;
    	if (mid>=k4) clear(k1*2,k2,mid,k4); else clear(k1*2+1,mid+1,k3,k4);
    }
    int compare1(int k1,int k2){
    	return q[k1].r>q[k2].r||(q[k1].r==q[k2].r&&k1<k2);
    }
    int compare2(int k1,int k2){
    	return q[k1].l<q[k2].l||(q[k1].l==q[k2].l&&k1<k2);
    }
    int compare3(int k1,int k2){
    	return q[k1].r>q[k2].r||(q[k1].r==q[k2].r&&k1<k2);
    }
    void add(int k1,int k2,int k3,int k4,atom k5){
    	num[k1]=num[k1]+k5;
    	if (k2==k3) return;
    	int mid=k2+k3>>1;
    	if (mid>=k4) add(k1*2,k2,mid,k4,k5); else add(k1*2+1,mid+1,k3,k4,k5);
    }
    atom find(int k1,int k2,int k3,int k4,int k5){
    	if (k2>k5||k3<k4) return (atom){1,0};
    	if (k2>=k4&&k3<=k5) return num[k1];
    	int mid=k2+k3>>1;
    	return find(k1*2,k2,mid,k4,k5)+find(k1*2+1,mid+1,k3,k4,k5);
    }
    void solve(int l,int r){
    	if (l==r) return;
    	int mid=l+r>>1;
    	solve(l,mid); solve(mid+1,r);
    	len=0;
    	for (int i=l;i<=mid;i++) if (q[i].pd==1) a[++len]=i;
    	for (int i=mid+1;i<=r;i++) if (q[i].pd==2) a[++len]=i;
    	
    	sort(a+1,a+len+1,compare1);
    	for (int i=1;i<=len;i++)
    		if (q[a[i]].pd==1) add(1,1,n,q[a[i]].l,q[a[i]].w1);
    		else ans[a[i]]=ans[a[i]]+find(1,1,n,1,q[a[i]].l);
    	for (int i=1;i<=len;i++) if (q[a[i]].pd==1) clear(1,1,n,q[a[i]].l);
    	
    	sort(a+1,a+len+1,compare2);
    	for (int i=1;i<=len;i++)
    		if (q[a[i]].pd==1) add(1,1,n,q[a[i]].r,q[a[i]].w0);
    		else ans[a[i]]=ans[a[i]]+find(1,1,n,q[a[i]].l,q[a[i]].r-1);
    	for (int i=1;i<=len;i++) if (q[a[i]].pd==1) clear(1,1,n,q[a[i]].r);
    	
    	sort(a+1,a+len+1,compare3);
    	for (int i=1;i<=len;i++)
    		if (q[a[i]].pd==1) add(1,1,n,q[a[i]].l,q[a[i]].w0);
    		else ans[a[i]]=ans[a[i]]+find(1,1,n,q[a[i]].l+1,q[a[i]].r);
    	for (int i=1;i<=len;i++) if (q[a[i]].pd==1) clear(1,1,n,q[a[i]].l);
    }
    int main(){
    	//freopen("bit.in","r",stdin);
    	//freopen("bit.out","w",stdout);
    	scanf("%d%d",&n,&m);
    	for (int i=1;i<=m;i++) q[i].scan(i);
    	for (int i=1;i<=n;i++) clear(1,1,n,i);
    	for (int i=1;i<=m;i++) ans[i]=(atom){1,0};
    	solve(1,m);
    	int pre=0;
    	for (int i=1;i<=m;i++)
    		if (q[i].pd==1) pre++;
    		else if (q[i].l==0){
    			if (pre&1) printf("%d\n",ans[i].y); else printf("%d\n",ans[i].x);
    		} else printf("%d\n",ans[i].x);
    	return 0;
    }
    
    
    • 1

    Information

    ID
    18791
    Time
    4000ms
    Memory
    512MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By