线段树 最大数

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值