[线段树] An easy problem 2015 ACM/ICPC Asia Regional Shanghai Online H

https://vjudge.net/contest/237063#problem/H

One day, a useless calculator was being built by Kuros. Let's assume that number X is showed on the screen of calculator. At first, X = 1. This calculator only supports two types of operation. 
1. multiply X with a number. 
2. divide X with a number which was multiplied before. 
After each operation, please output the number X modulo M. 
InputThe first line is an integer T( 1T101≤T≤10), indicating the number of test cases. 
For each test case, the first line are two integers Q and M. Q is the number of operations and M is described above. ( 1Q105,1M1091≤Q≤105,1≤M≤109
The next Q lines, each line starts with an integer x indicating the type of operation. 
if x is 1, an integer y is given, indicating the number to multiply. ( 0<y1090<y≤109
if x is 2, an integer n is given. The calculator will divide the number which is multiplied in the nth operation. (the nth operation must be a type 1 operation.) 

It's guaranteed that in type 2 operation, there won't be two same n. 
OutputFor each test case, the first line, please output "Case #x:" and x is the id of the test cases starting from 1. 
Then Q lines follow, each line please output an answer showed by the calculator. 
Sample Input
1
10 1000000000
1 2
2 1
1 2
1 10
2 3
2 4
1 6
1 7
1 12
2 7
Sample Output
Case #1:
2
1
2
20
10
1
6
42
504
84




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

const int mq = 100010;

ll mod;
ll a[mq * 4];  /// 内存  n * 4

void build(int l, int r, int id)
{
	if (l == r)
	{
		a[id] = 1 % mod;
		return;
	}
	int mid = (l + r) / 2;
	build(l, mid, 2 * id);
	build(mid + 1, r, 2 * id + 1);
	a[id] = a[id * 2] * a[id * 2 + 1] % mod;
	return;
}

void update(int l, int r, int id, int u, ll v)
{
	if (l == r)
	{
		a[id] = v % mod;
		return;
	}
	int mid = (l + r) / 2;
	if (u <= mid)
		update(l, mid, 2 * id, u, v);
	else if (u > mid && u <= r)
		update(mid + 1, r, 2 * id + 1, u, v);
	a[id] = a[2 * id] * a[2 * id + 1] % mod;
	return;
}


int main()
{
	int T;
	scanf("%d", &T);
	for (int TT = 1; TT <= T; TT++)
	{
		printf("Case #%d:\n", TT);
		int q;
		scanf("%d %lld", &q, &mod);
		
		build(1, q, 1);
		
		for (int u = 1; u <= q; u++)
		{
			int x;
			scanf("%d", &x);
			if (x == 1)
			{
				long long y;
				scanf("%lld", &y);
				update(1, q, 1, u, y);
			}
			else if (x == 2)
			{
				int y;
				scanf("%d", &y);
				update(1, q, 1, y, 1);
			}
			printf("%lld\n", a[1]);
		}
	}
	return 0;
}


猜你喜欢

转载自blog.csdn.net/ummmmm/article/details/80970499