Multiply game HDU
阿新 • • 發佈:2018-12-15
題解
給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;
}