Advertisement
Guest User

Untitled

a guest
Nov 27th, 2014
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6.  
  7. typedef long long ll;
  8.  
  9. const int N = 100010;
  10. int n, m;
  11. ll b, p;
  12.  
  13. ll f[4 * N];
  14. ll pw[N];
  15.  
  16. void update(int i, ll val, int par = 1, int l = 1, int r = n)
  17. { if(i < l || i > r)
  18. return;
  19.  
  20. if(l == r)
  21. { f[par] = val % p;
  22. }
  23. else
  24. { update(i, val, 2*par, l, (l+r)/2);
  25. update(i, val, 2*par+1, 1+(l+r)/2, r);
  26.  
  27. f[par] = (f[2*par] * pw[r - (l+r)/2] + f[2*par+1]) % p;
  28. }
  29. }
  30.  
  31. ll query(int i, int j, int par = 1, int l = 1, int r = n)
  32. { if(i > r || j < l)
  33. return 0;
  34.  
  35. if(l >= i && r <= j)
  36. return f[par];
  37.  
  38. ll x, y;
  39.  
  40. x = query(i, j, 2*par, l, (l+r)/2);
  41. y = query(i, j, 2*par+1, 1+(l+r)/2, r);
  42. return (x * pw[min(j, r) - max((r+l)/2, i)] + y) % p;
  43. }
  44.  
  45. int main(int argc, char *argv[])
  46. { while(scanf("%lld %lld %d %d", &b, &p, &n, &m) == 4)
  47. { if(b || p || n || m)
  48. { memset(f, 0, sizeof(f));
  49. b = b % p;
  50.  
  51. pw[0] = 1;
  52. for(int i = 1; i <= n; i++)
  53. { pw[i] = (pw[i-1] * b) % p;
  54. }
  55.  
  56. for(int i = 0; i < m; i++)
  57. { char s[2];
  58. int l, r;
  59. ll x;
  60.  
  61. scanf("%s", s);
  62.  
  63. if(s[0] == 'E')
  64. { scanf("%d %lld", &l, &x);
  65. update(l, x);
  66. }
  67. else
  68. { scanf("%d %d", &l, &r);
  69. printf("%lld\n", query(l, r));
  70. }
  71. }
  72. puts("-");
  73. }
  74. }
  75. return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement