1. 程式人生 > >Multiply game HDU

Multiply game HDU

題解

給n個數字 兩種操作一種將某個點修改為某個值 另一種詢問一個區間的所有元素乘積

線段樹模板提 單點修改區間查詢

AC程式碼

#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int MAXN = 5e4 + 10;
ll a[MAXN];

struct node 
{
	int l, r;
	ll v;
}tre[MAXN * 4
]; inline void PushUp(int x) { tre[x].v = tre[x << 1].v * tre[x << 1 | 1].v % MOD; } void Build(int x, int l, int r) { tre[x].l = l, tre[x].r = r, tre[x].v = 0; if (l == r) tre[x].v = a[l]; else { int m = l + r >> 1; Build(x << 1, l, m); Build(x << 1 | 1, m +
1, r); PushUp(x); } } void Update(int x, int p, ll v) { int l = tre[x].l, r = tre[x].r; if (l == r) tre[x].v = v; else { int m = l + r >> 1; if (m >= p) Update(x << 1, p, v); else Update(x << 1 | 1, p, v); PushUp(x); } } ll Query(int x, int pl, int pr) {
int l = tre[x].l, r = tre[x].r; if (pl <= l && r <= pr) return tre[x].v; else { int m = l + r >> 1; ll v = 1; if (m >= pl) v = v * Query(x << 1, pl, pr) % MOD; if (m < pr) v = v * Query(x << 1 | 1, pl, pr) % MOD; return v; } } int main() { #ifdef LOCAL freopen("C:/input.txt", "r", stdin); #endif int T; cin >> T; while (T--) { int n, q; cin >> n; for (int i = 1; i <= n; i++) scanf("%d", &a[i]); Build(1, 1, n); cin >> q; for (int i = 0; i < q; i++) { int op, x, y; scanf("%d%d%d", &op, &x, &y); if (op) Update(1, x, y); else printf("%lld\n", Query(1, x, y)); } } return 0; }