#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
const int N = 200001; //元素的个数
const int INF = 0x7FFFFFFF; //最大值
int Lt(int p) { return p << 1; } //左子节点
int Rt(int p) { return p << 1 | 1; } //右子节点
int tree[4 * N]; //树的结点个数要4倍
//更新区间
void push_up(int p)
{
//求区间和
/*tree[p] = tree[Lt(p)] + tree[Rt(p)];*/
//求最大值
tree[p] = max(tree[Lt(p)],tree[Rt(p)]);
}
//更新树,建树
void updata(int p, int pL, int pR,int L,int R, int d)
{
if (L <= pL && pR <= R)
{
tree[p] = d;
return;
}
int mid = (pL + pR) >> 1;
if (L <= mid)
updata(Lt(p), pL, mid, L, R, d);
if (R > mid)
updata(Rt(p), mid + 1, pR, L, R, d);
push_up(p);
return;
}
//区间查询
int query(int p, int pL, int pR, int L, int R)
{
int ans = -INF;
if (L <= pL && pR <= R)
return tree[p];
int mid = (pL + pR) >> 1;
if (L <= mid)
ans = max(ans, query(Lt(p), pL, mid, L, R));
if (R > mid)
ans = max(ans, query(Rt(p), mid + 1, pR, L, R));
return ans;
}
int main()
{
int m = 0, d = 0, L = 0, t = 0, n = 0, size = 0;
char s[3];
scanf("%d %d", &m, &d);
while (m--)
{
scanf("%s", s);
if (s[0] == 'Q') //区间查询
{
scanf("%d", &L);
t = query(1, 1, N, size - L + 1, size);
printf("%d\n", t);
}
else
{
scanf("%d\n", &n);
size++;
n = (n + t) % d;
updata(1, 1, N, size, size, n);
}
}
return 0;
}
线段树 最大数
最新推荐文章于 2024-07-14 19:56:17 发布