大佬救命,样例和额外测试点过了,其余都没过,用的二分的方法 提交记录https://www.luogu.com.cn/record/150854380
#include <iostream>
using namespace std;
long long D;
int len = 1;
long long t = 0;
long long num[200006][20] = { 0 };
long long Search(int head, int tail)
{
long long max = -200000000;
int d = 0;
while (head != tail)
{
if (head % 2 == 1)
{
head = head / 2 + 1;
}
else
{
max = max > num[head][d] ? max : num[head][d];
head = head / 2;
}
if (tail % 2 == 1)
{
max = max > num[tail][d] ? max : num[tail][d];
tail = tail / 2;
}
else
{
tail = tail / 2;
}
d++;
}
max = max > num[head][d] ? max : num[head][d];
return max;
}
int main()
{
int M;
cin >> M >> D;
for (int i = 1; i <= M; i++)
{
char c;
long long x;
cin >> c >> x;
if (c == 'A')
{
num[len][0] = (t + x) % D;
len++;
int d = 0;
int length = len - 1;
while (length % 2 == 0)
{
d++;
num[length / 2][d] = num[length][d - 1] >= num[length - 1][d - 1] ? num[length][d - 1] : num[length - 1][d - 1];
length = length / 2;
}
}
else
{
int tail = len - 1;
int head = len - x;
t = Search(head, tail);
cout << t << endl;
}
}
return 0;
}