Advertisement
Guest User

Untitled

a guest
Dec 16th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.48 KB | None | 0 0
  1. fact[0]=1;
  2. for(int i=1; i<fact.length; ++i)
  3.     fact[i]=fact[i-1]*i%M;
  4. int n=in.nextInt(), m=in.nextInt(), blockSize=(int)Math.sqrt(n), blocks=(n-1)/blockSize+1;
  5. int[] a = new int[n], gInc = new int[blocks];
  6. int[][] cnt = new int[45][blocks];
  7. for(int i=0; i<n; ++i) {
  8.     a[i]=in.nextInt();
  9.     if(a[i]<45)
  10.         ++cnt[a[i]][i/blockSize];
  11. }
  12. while(m-->0) {
  13.     int qT=in.nextInt(), q1=in.nextInt(), q2=in.nextInt();
  14.     if(qT==1) {
  15.         --q1;
  16.         --q2;
  17.         int l=q1%blockSize, lB=q1/blockSize, r=q2%blockSize, rB=q2/blockSize;
  18.         while(lB<rB||lB==rB&&l<=r) {
  19.             if(l!=0||lB==rB) {
  20.                 int a1=a[lB*blockSize+l]+gInc[lB];
  21.                 if(a1<45)
  22.                     --cnt[a1][lB];
  23.                 ++a[lB*blockSize+l];
  24.                 if(a1+1<45)
  25.                     ++cnt[a1+1][lB];
  26.                 ++l;
  27.                 if(l>=blockSize) {
  28.                     l=0;
  29.                     ++lB;
  30.                 }
  31.             } else {
  32.                 ++gInc[lB];
  33.                 for(int i=43; i>=1; --i)
  34.                     cnt[i+1][lB]=cnt[i][lB];
  35.                 cnt[1][lB]=0;
  36.                 ++lB;
  37.             }
  38.         }
  39.     } else if(qT==2) {
  40.         long t=0;
  41.         --q1;
  42.         --q2;
  43.         int l=q1%blockSize, lB=q1/blockSize, r=q2%blockSize, rB=q2/blockSize;
  44.         while(lB<rB||lB==rB&&l<=r) {
  45.             if(l!=0||lB==rB) {
  46.                 int a1=a[lB*blockSize+l]+gInc[lB];
  47.                 if(a1<45)
  48.                     t+=fact[a1];
  49.                 ++l;
  50.                 if(l>=blockSize) {
  51.                     l=0;
  52.                     ++lB;
  53.                 }
  54.             } else {
  55.                 for(int i=1; i<=44; ++i)
  56.                     t+=fact[i]*cnt[i][lB];
  57.                 ++lB;
  58.             }
  59.         }
  60.         out.println(t%M);
  61.     } else {
  62.         --q1;
  63.         int block=q1/blockSize, a1=a[q1]+gInc[block];
  64.         if(a1<45)
  65.             --cnt[a1][block];
  66.         a[q1]=q2-gInc[block];
  67.         if(q2<45)
  68.             ++cnt[q2][block];
  69.     }
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement