Advertisement
Guest User

Untitled

a guest
Mar 24th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 KB | None | 0 0
  1. #include <fstream>
  2.  
  3. using namespace std;
  4.  
  5. ifstream in;
  6. ofstream out;
  7.  
  8. struct matrix {
  9. int a;
  10. int b;
  11. int c;
  12. int d;
  13. };
  14.  
  15. matrix buildmatrix(int a, int b, int c, int d) {
  16. matrix e;
  17. e.a = a;
  18. e.b = b;
  19. e.c = c;
  20. e.d = d;
  21. return e;
  22. }
  23.  
  24. matrix multiply (matrix m,matrix s, int r) {
  25. matrix e;
  26. e.a = (m.a * s.a + m.b * s.c) % r;
  27. e.b = (m.a * s.b + m.b * s.d) % r;
  28. e.c = (m.c * s.a + m.d * s.c) % r;
  29. e.d = (m.c * s.b + m.d * s.d) % r;
  30. return e;
  31. }
  32.  
  33. void print(matrix e) {
  34. out << e.a << ' ' << e.b << ' ' << '\n' << e.c << ' ' << e.d << '\n';
  35. }
  36.  
  37. const matrix neutral = buildmatrix(1, 0, 0, 1);
  38.  
  39. struct tree {
  40. int l;
  41. int r;
  42. matrix value;
  43. };
  44.  
  45. void update(tree tr[], int x, int r) {
  46. tr[x].value = multiply(tr[2 * x].value, tr[2 * x + 1].value, r);
  47. }
  48.  
  49. void buildtree(matrix mt[], tree tr[], int x, int l, int r, int r1) {
  50. tr[x].l = l;
  51. tr[x].r = r;
  52. if (l + 1 == r) {
  53. tr[x].value = mt[l];
  54. return;
  55. }
  56. int m = (l + r) / 2;
  57. buildtree(mt, tr, 2 * x, l, m, r1);
  58. buildtree(mt, tr, 2 * x + 1, m, r, r1);
  59. update(tr, x, r1);
  60. }
  61.  
  62. matrix get(tree tr[], int x, int l, int r, int r1) {
  63. if ((tr[x].l >= r) or (tr[x].r <= l)) {
  64. return neutral;
  65. }
  66. if ((tr[x].l >= l) and (tr[x].r <= r)) {
  67. return tr[x].value;
  68. }
  69. return multiply(get(tr, 2 * x, l, r, r1), get(tr, 2 * x + 1, l, r, r1), r1);
  70. }
  71.  
  72. int main() {
  73. in.open("crypto.in");
  74. out.open("crypto.out");
  75. int n, r, m;
  76. in >> r >> n >> m;
  77. matrix mt[n];
  78. for (int i = 0; i < n; i++) {
  79. int a, b, c, d;
  80. in >> a >> b >> c >> d;
  81. mt[i] = buildmatrix(a, b, c, d);
  82. }
  83. tree tr[n * 4];
  84. buildtree(mt, tr, 1, 0, n, r);
  85. /*for (int i = 0; i < 4 * n; i++) {
  86. print(tr[i].value);
  87. out << ' ' << i << '\n';
  88. }*/
  89. for (int i = 0; i < m; i++) {
  90. int l, r1;
  91. in >> l >> r1;
  92. print(get(tr, 1, l - 1, r1, r));
  93. }
  94. in.close();
  95. out.close();
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement