#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int arr[N], tree[N];
int m, T, t, H;
char ch;
long long D;
int Cha_tree(int node, int begin, int end, int L, int R){//查找线段树
if(begin>R || end<L) return 0;
else if(begin==end || (begin>=L && end<=R)) return tree[node];
int zhong=(begin+end)>>1;
int L_tree=2*node+1;
int R_tree=2*node+2;
int L_max=Cha_tree(L_tree, begin, zhong, L, R);
int R_max=Cha_tree(R_tree, zhong+1, end, L, R);
return max(L_max, R_max);
}
void add_tree(int node, int begin, int end, int idx, int val){//添加新的节点并更新线段树
if(begin==end){
tree[node]=val;
return;
}
int zhong=(begin+end)>>1;
int L_tree=2*node+1;
int R_tree=2*node+2;
if(idx>=begin && idx<=zhong) add_tree(L_tree, begin, zhong, idx, val);
else add_tree(R_tree, zhong+1, end, idx, val);
tree[node]=max(tree[L_tree], tree[R_tree]);
}
void Jian_tree(int node, int begin, int end){//建立线段树
if(begin==end){
tree[node]=arr[end];
return;
}
int zhong=(begin+end)>>1;
int l_tree=2*node+1;
int r_tree=2*node+2;
Jian_tree(l_tree, begin, zhong);
Jian_tree(r_tree, zhong+1, end);
tree[node]=max(tree[l_tree], tree[r_tree]);
}
int main()
{
cin>>m>>D;
while(m--){
cin>>ch>>H;
if(ch=='A'){
arr[T++]=(H+t)%D;
add_tree(0, 0, T-1, T-1, (H+t)%D);
//Jian_tree(0, 0, T);
}
else {
t=Cha_tree(0, 0, T-1, T-H, T-1);
cout<<t<<endl;
}
}
return 0;
}
思路我觉得是对的呀,可是过不了样例最后一个查询,如果我插入哪里用Jian_tree的话就能过样例,但是提交只能过2个点,会超时,我想请问各位大佬能指出我的不足点吗?