1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | #include <stdio.h> #include <cmath> #include <string.h> #define div 1000000007 typedef long long ll; using namespace std; ll tree[20000000]; ll size,ret; void update(ll idx, ll num) { idx += size - 1; tree[idx] = num; while (idx > 1) { idx /= 2; tree[idx] = tree[idx * 2] * tree[idx * 2 + 1]%div; } } void mul(ll left, ll right, ll idx, ll nL, ll nR) { if (nR < left || right < nL) { return; } if (left <= nL&& nR <= right) { ret *= tree[idx]; ret %= div; return; } ll mid = (nL + nR) / 2; mul(left, right, idx * 2, nL, mid); mul(left, right, idx * 2 + 1, mid + 1, nR); } int main() { ll n, m, k; scanf("%lld %lld %lld", &n,&m,&k); getchar(); for (int i = 1; i < 1000; i++) { if (n < pow(2, i)) { size = (int)pow(2, i); break; } } for (ll i = 1; i <= 2*size; i++) { tree[i] = 1; } for (ll i = 1; i <= n; i++) { ll x; scanf("%lld", &x); update(i, x%div); } ll a, b, c; for (ll i = 0; i < m + k; i++) { scanf("%lld %lld %lld", &a, &b, &c); if (a == 1) { update(b, c%div); } else { ret = 1; mul(b, c,1,1,size); printf("%lld\n", ret%div); } } } | cs |
'알고리즘 > 세그먼트 트리' 카테고리의 다른 글
2357 최댓값과 최솟값 (0) | 2019.02.15 |
---|---|
2042 부분합 (0) | 2019.02.14 |