记录编号 184261 评测结果 AAAAAAAAAA
题目名称 [JSOI 2008] 最大数 最终得分 100
用户昵称 Gravatar啊吧啦吧啦吧 是否通过 通过
代码语言 C++ 运行时间 3.312 s
提交时间 2015-09-02 16:18:47 内存使用 25.00 MiB
显示代码纯文本
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bzoj_1012.in");
ofstream fout("bzoj_1012.out");
#define cin fin
#define cout fout
#define int long long
const int MAXM(200001);
long long x, m, d, matrix[MAXM * 18], len, last, query(int, int, int, int, int);
char c;
void update(int, int, int, int, int);

main()
{
//	cout << sizeof(matrix) / 1024 / 1024 << endl;
	cin >> m >> d;
	for (int i = 0; i < m; ++i){
		cin >> c >> x;		
		if (c == 'A')
			update(++len, (x + last) % d, 1, m, 1);
		else{
			last = query(len - x + 1, len, 1, m, 1);
			cout << last << endl;
		}
	}
	fin.close();
	fout.close();
//	for (; ; );
}

void update(int po, int ve, int l, int r, int ro)
{
	if (l == r){
		matrix[ro] = ve;
		return;
	}
	int m = (l + r) >> 1;
	if (m >= po)
		update(po, ve, l, m, ro << 1);
	else
		update(po, ve, m + 1, r, ro << 1 | 1);
	matrix[ro] = max(matrix[ro << 1], matrix[ro << 1 | 1]);
}

long long query(int ll, int rr, int l, int r, int ro)
{
	if (ll <= l && rr >= r)
		return matrix[ro];
	int m = (l + r) >> 1;
	long long re = 0;
	if (ll <= m)
		re = max(re, query(ll, rr, l, m, ro << 1));
	if (rr > m)
		re = max(re, query(ll, rr, m + 1, r, ro << 1 | 1));
	return re;
}