hdu-5475

  • 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5475

  • 题目大意: 有两种操作 1: x * value, 2: x / value[n] 除以第n次的操作数, x初始为1

  • 思路: 除以第n次的值就是将其变为1, 线段树求区间乘积, 点更新

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
70
71
72
73
74
75
76
77
78
79
80
using namespace std;
const long long kMaxO = 100001;
long long kT, kQ, kMod;
long long kOp, kX, kN;
long long kMul[kMaxO<<2];
void (long long rt)
{
kMul[rt] = ((kMul[rt<<1] % kMod) * (kMul[rt<<1|1] % kMod))% kMod;
}
void BuildTree(long long l, long long r, long long rt)
{
if(l == r)
{
kMul[rt] = 1;
return ;
}
long long mid = (l + r) >> 1;
BuildTree(l, mid, rt<<1);
BuildTree(mid + 1, r, rt<<1|1);
PushUp(rt);
}
long long QueryTree(long long left, long long right, long long l, long long r, long long rt)
{
if(left <= l && right <= r)
return kMul[rt];
long long mid = (l + r) >> 1;
long long ret = 1;
if(left <= mid)
ret *= QueryTree(left, right, l, mid, rt << 1);
if(right > mid)
ret *= QueryTree(left, right, mid+1, r, rt << 1 | 1);
return ret;
}
void UpdateTree(long long loc, long long val, long long l, long long r, long long rt)
{
if(l == r){
kMul[rt] = val % kMod;
return ;
}
long long mid = (l + r) >> 1;
if(loc <= mid)
UpdateTree(loc, val, l, mid, rt << 1);
else
UpdateTree(loc, val, mid + 1, r, rt << 1 | 1);
PushUp(rt);
}
int main()
{
scanf("%lld", &kT);
for(long long case_id = 1; case_id <= kT; ++case_id)
{
kX = 1;
scanf("%lld%lld", &kQ, &kMod);
printf("Case #%lld:n", case_id);
BuildTree(1, kQ, 1);
for(long long i = 1; i <= kQ; ++i)
{
scanf("%d%d", &kOp, &kN);
if(kOp == 1)
UpdateTree(i, kN, 1, kQ, 1);
else
UpdateTree(kN, 1, 1, kQ, 1);
kX = kMul[1];
printf("%lldn", kX);
}
}
return 0;
}