Submission #539743

#TimeUsernameProblemLanguageResultExecution timeMemory
539743cig32Sterilizing Spray (JOI15_sterilizing)C++17
100 / 100
253 ms6912 KiB
#include "bits/stdc++.h"
using namespace std;
const int MAXN = 2e5 + 10;
const int MOD = 1e9 + 7;
#define int long long
#define ll __int128
mt19937_64 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());
int rnd(int x, int y) {
  int u = uniform_int_distribution<int>(x, y)(rng); return u;
}
ll read() { // read int128
  int x; cin >> x; return (ll)x;
}
long long bm(long long b, long long p) {
  if(p==0) return 1 % MOD;
  long long r = bm(b, p >> 1);
  if(p&1) return (((r*r) % MOD) * b) % MOD;
  return (r*r) % MOD;
}
long long inv(long long b) { 
  return bm(b, MOD-2);
}
long long f[MAXN];
long long nCr(int n, int r) { 
  long long ans = f[n]; ans *= inv(f[r]); ans %= MOD;
  ans *= inv(f[n-r]); ans %= MOD; return ans;
}
void precomp() { 
  for(int i=0; i<MAXN; i++) f[i] = (i == 0 ? 1 % MOD : (f[i-1] * i) % MOD);
}
int st[4*MAXN];

void u1(int l, int r, int tar, int idx, int val) {
  if(l == r) {
    st[idx] = val;
    return;
  }
  int mid = (l + r) >> 1;
  if(tar <= mid) u1(l, mid, tar, 2*idx+1, val);
  else u1(mid+1, r, tar, 2*idx+2, val);
  st[idx] = st[2*idx+1] + st[2*idx+2];
}
void u2(int l, int r, int constl, int constr, int idx, int val) {
  if(constl == constr) {
    st[idx] /= val;
    return;
  }
  if(st[idx] == 0) return;
  int mid = (constl+constr) >> 1;
  if(mid<l || r<constl) u2(l, r, mid+1, constr, 2*idx+2, val);
  else if(constr<l || r<mid+1) u2(l, r, constl, mid, 2*idx+1, val);
  else {
    u2(l, r, constl, mid, 2*idx+1, val);
    u2(l, r, mid+1, constr, 2*idx+2, val);
  }
  st[idx] = st[2*idx+1] + st[2*idx+2];
}
int qu(int l, int r, int constl, int constr, int idx) {
  if(l<=constl && constr<=r) return st[idx];
  int mid = (constl+constr) >> 1;
  if(mid<l || r<constl) return qu(l, r, mid+1, constr, 2*idx+2);
  else if(constr<l || r<mid+1) return qu(l, r,constl, mid,2*idx+1);
  else {
    return qu(l, r, constl, mid, 2*idx+1) + qu(l, r, mid+1, constr, 2*idx+2);
  }
}

void point_update(int i, int v) {
  u1(0, MAXN - 1, i, 0, v);
}

void range_divide(int l, int r, int k) {
  if(k == 1) return;
  u2(l, r, 0, MAXN - 1, 0, k);
}

int query_sum(int l, int r) {
  return qu(l, r, 0, MAXN - 1, 0);
}

void solve(int tc) {
  int n, q, k;
  cin >> n >> q >> k;
  for(int i=1; i<=n; i++) {
    int st;
    cin >> st;
    point_update(i, st);
  }
  while(q--) {
    int s, t, u;
    cin >> s >> t >> u;
    if(s == 1) {
      point_update(t, u);
    }
    else if(s == 2) {
      range_divide(t, u, k);
    }
    else {
      cout << query_sum(t, u) << "\n";
    }
  }
}
int32_t main(){
  precomp();
  ios::sync_with_stdio(0); cin.tie(0);
  int t = 1; //cin >> t;
  for(int i=1; i<=t; i++) solve(i);
} 
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...