a53

Actualizare Element, Produs Interval, Matrice

a53
Feb 22nd, 2020
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.16 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define nmax 100001
  3. #define MOD 9901
  4. using namespace std;
  5. ifstream f("aepim.in");
  6. ofstream g("aepim.out");
  7. struct MATRICE
  8. {
  9. int a[4][4];
  10. };
  11. MATRICE arb[4*nmax+55],A,prod_mat;
  12. int i,n,m,x,y,t,K;
  13. char v[10],Y[10];
  14.  
  15. void sir_mat(char sir[])
  16. {
  17. int i=1;
  18. for(int j=1;j<=K*K;++j)
  19. {
  20. if(j%K!=0)
  21. A.a[i][j%K]=sir[j-1]-'0';
  22. else
  23. A.a[i][K]=sir[j-1]-'0';
  24. if(j%K==0)
  25. ++i;
  26. }
  27. }
  28.  
  29. void inm_mat(MATRICE a,MATRICE b)
  30. {
  31. for(int i=1;i<=K;++i)
  32. for(int j=1;j<=K;++j)
  33. {
  34. prod_mat.a[i][j]=0;
  35. for(int k=1;k<=K;++k)
  36. prod_mat.a[i][j]=(prod_mat.a[i][j]+(a.a[i][k]*b.a[k][j]))%MOD;
  37. }
  38. }
  39.  
  40. void update(int nod,int st,int dr,int poz,char val[])
  41. {
  42. if(st==dr)
  43. {
  44. sir_mat(val),arb[nod]=A;/// arb[nod]=val;
  45. return;
  46. }
  47. int mij=(st+dr)/2;
  48. if(poz<=mij)update(2*nod,st,mij,poz,val);
  49. else update(2*nod+1,mij+1,dr,poz,val);
  50. inm_mat(arb[2*nod],arb[2*nod+1]); /// arb[nod]=produsul(arb[2*nod],arb[2*nod+1]);
  51. arb[nod]=prod_mat;
  52. }
  53.  
  54. void query(int nod,int st,int dr,int a,int b)
  55. {
  56. if(a<=st&&dr<=b)
  57. {
  58. inm_mat(prod_mat,arb[nod]); /// produs=produsul(mi,arb[nod]);
  59. return;
  60. }
  61. int mij=(st+dr)/2;
  62. if(a<=mij)query(2*nod,st,mij,a,b);
  63. if(mij<b)query(2*nod+1,mij+1,dr,a,b);
  64. }
  65.  
  66. void Afisez(MATRICE a)
  67. {
  68. for(int i=1;i<=K;++i)
  69. for(int j=1;j<=K;++j)
  70. g<<a.a[i][j]<<' ';
  71. g<<'\n';
  72. }
  73.  
  74. int main()
  75. {
  76. f>>n>>K;
  77. for(i=1;i<=n;++i)
  78. {
  79. f>>v;
  80. update(1,1,n,i,v);
  81. }
  82. f>>m;
  83. while(m--)
  84. {
  85. f>>t;
  86. if(t==1)
  87. {
  88. f>>x>>y; /// y - numar
  89. for(int i=1;i<=K;++i)
  90. for(int j=1;j<=K;++j)
  91. if(i!=j)
  92. prod_mat.a[i][j]=0;
  93. else
  94. prod_mat.a[i][j]=1;
  95. query(1,1,n,x,y);
  96. Afisez(prod_mat);
  97. }
  98. else
  99. {
  100. f>>x>>Y; /// Y - sir
  101. update(1,1,n,x,Y);
  102. }
  103. }
  104. return 0;
  105. }
Add Comment
Please, Sign In to add comment