1 solutions
-
0
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