#include<bits/stdc++.h>
using namespace std;
const int N = 200010;
int a,t,p,l,m,n;
struct stu
{
int l,r;
int v;//根据pushup定义所需的变量
} tr[N * 4];
void pushup(int u)//用两个子结点更新父节点
{
tr[u].v = max(tr[u * 2].v,tr[u * 2 + 1].v);
}
void build(int u,int l,int r)
{
tr[u] = {l,r};//不能忘
if(l == r)//可输入值
return ;
int mid = (l + r) / 2;//唯一的l+r
build(u * 2,l,mid);//递归建树
build(u * 2 + 1,mid + 1,r);
}
int query(int u,int l,int r)
{
if(tr[u].l >= l && tr[u].r <= r)//都在查询范围内
return tr[u].v;
int v = 0,mid = (tr[u].l + tr[u].r) / 2;
if(l <= mid)//一定与左边有交集
v = query(u * 2,l,r);
if(r > mid)//右边
v = max(v,query(u * 2 + 1,l,r));
return v;
}
void modify(int u,int x,int v)
{
if(tr[u].l == x && tr[u].r == x)
tr[u].v = v;//修改
else
{
int mid = (tr[u].l + tr[u].r) / 2;
if(x <= mid)
modify(u * 2,x,v);
else
modify(u * 2 + 1,x,v);
pushup(u);//不要忘了修改完了重新pushup,放else因为修改的点没有子结点
}
}
int main()
{
cin>>m>>p;
char op;
build(1,1,m);
while(m -- )
{
cin>>op>>l;
if(op == 'Q')
{
a = query(1,n - l + 1,n);//查找末尾l位
cout<<a<<endl;
}
else
{
n ++;
modify(1,n,(l + a) % p);
}
}
return 0;
}
单点修改+查找区间最大值
最新推荐文章于 2024-05-15 23:45:38 发布