#include #include #define rep(i,n) for(int i=0;i vi; typedef vector vl; typedef vector> vvi; typedef vector> vvl; typedef long double ld; typedef pair P; template ostream& operator<<(ostream& os, const static_modint& a) {os << a.val(); return os;} template ostream& operator<<(ostream& os, const dynamic_modint& a) {os << a.val(); return os;} template istream& operator>>(istream& is, static_modint& a) {long long x; is >> x; a = x; return is;} template istream& operator>>(istream& is, dynamic_modint& a) {long long x; is >> x; a = x; return is;} template istream& operator>>(istream& is, vector& v){int n = v.size(); assert(n > 0); rep(i, n) is >> v[i]; return is;} template ostream& operator<<(ostream& os, const pair& p){os << p.first << ' ' << p.second; return os;} template ostream& operator<<(ostream& os, const vector& v){int n = v.size(); rep(i, n) os << v[i] << (i == n - 1 ? "\n" : " "); return os;} template ostream& operator<<(ostream& os, const vector>& v){int n = v.size(); rep(i, n) os << v[i] << (i == n - 1 ? "\n" : ""); return os;} template ostream& operator<<(ostream& os, const set& se){for(T x : se) os << x << " "; os << "\n"; return os;} template ostream& operator<<(ostream& os, const unordered_set& se){for(T x : se) os << x << " "; os << "\n"; return os;} template ostream& operator<<(ostream& os, const atcoder::segtree& seg){int n = seg.max_right(0, [](S){return true;}); rep(i, n) os << seg.get(i) << (i == n - 1 ? "\n" : " "); return os;} template ostream& operator<<(ostream& os, const atcoder::lazy_segtree& seg){int n = seg.max_right(0, [](S){return true;}); rep(i, n) os << seg.get(i) << (i == n - 1 ? "\n" : " "); return os;} template void chmin(T& a, T b){a = min(a, b);} template void chmax(T& a, T b){a = max(a, b);} // https://ei1333.github.io/luzhiled/snippets/math/mod-pow.html template< typename T > T mod_pow(T x, T n, const T &p) { T ret = 1; while(n > 0) { if(n & 1) (ret *= x) %= p; (x *= x) %= p; n >>= 1; } return ret; } using T = uint8_t; const int M = 100; int B; using S = array; S zero; S op(S a, S b){ rep(i, B){ a[i] += b[i]; if(a[i] >= B) a[i] -= B; } return a; } S e(){ return zero; } using F = array; S mapping(F f, S s){ S res; rep(i, B) res[i] = 0; rep(i, B){ res[f[i]] += s[i]; if(res[f[i]] >= B) res[f[i]] -= B; } return res; } F composite(F f, F g){ rep(i, B) g[i] = f[g[i]]; return g; } F identical; F id(){ return identical; } int main(){ int N, Q; cin >> N >> B >> Q; rep(i, B) zero[i] = 0; rep(i, B) identical[i] = i; vector in(N + 1); vector out(N + 1); int t = 0; auto dfs = [&](int from, auto dfs) -> void{ if(from > N) return; in[from] = t; t++; dfs(from * 2, dfs); dfs(from * 2 + 1, dfs); out[from] = t; }; dfs(1, dfs); vector a(N); for(int x = 1; x <= N; x++){ int idx = in[x]; a[idx] = x % B; } vector _init; { rep(idx, N){ S tmp; rep(i, B) tmp[i] = 0; tmp[a[idx]] = 1; _init.push_back(tmp); } } lazy_segtree seg(_init); rep(_, Q){ int x; long long d; cin >> x >> d; F transfer_sub; rep(j, B) transfer_sub[j] = (mod_pow(j, d, B) + 1) % B; int ans = 0; seg.apply(in[x], out[x], transfer_sub); auto res = seg.prod(in[x], out[x]); rep(i, B){ ans += (int)i * res[i]; ans %= B; } // for(auto x : res) cout << x << ' '; // cout << "\n"; cout << ans << "\n"; } return 0; }