Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- using namespace std;
- typedef long long ll;
- const int N = 100010;
- int n, m;
- ll b, p;
- ll f[4 * N];
- ll pw[N];
- void update(int i, ll val, int par = 1, int l = 1, int r = n)
- { if(i < l || i > r)
- return;
- if(l == r)
- { f[par] = val % p;
- }
- else
- { update(i, val, 2*par, l, (l+r)/2);
- update(i, val, 2*par+1, 1+(l+r)/2, r);
- f[par] = (f[2*par] * pw[r - (l+r)/2] + f[2*par+1]) % p;
- }
- }
- ll query(int i, int j, int par = 1, int l = 1, int r = n)
- { if(i > r || j < l)
- return 0;
- if(l >= i && r <= j)
- return f[par];
- ll x, y;
- x = query(i, j, 2*par, l, (l+r)/2);
- y = query(i, j, 2*par+1, 1+(l+r)/2, r);
- return (x * pw[min(j, r) - max((r+l)/2, i)] + y) % p;
- }
- int main(int argc, char *argv[])
- { while(scanf("%lld %lld %d %d", &b, &p, &n, &m) == 4)
- { if(b || p || n || m)
- { memset(f, 0, sizeof(f));
- b = b % p;
- pw[0] = 1;
- for(int i = 1; i <= n; i++)
- { pw[i] = (pw[i-1] * b) % p;
- }
- for(int i = 0; i < m; i++)
- { char s[2];
- int l, r;
- ll x;
- scanf("%s", s);
- if(s[0] == 'E')
- { scanf("%d %lld", &l, &x);
- update(l, x);
- }
- else
- { scanf("%d %d", &l, &r);
- printf("%lld\n", query(l, r));
- }
- }
- puts("-");
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement