初学线段树求助,悬赏关注
查看原帖
初学线段树求助,悬赏关注
711584
Lienqwq楼主2022/10/25 13:13
#include<bits/stdc++.h>
using namespace std;

const int N = 2e5 + 5;
int n ,m ,q ,last;
struct Tree {int l ,r ,val;}t[N * 4];

void pushup(int u) {t[u].val = max(t[u << 1].val ,t[u << 1 | 1].val);}

void build(int u ,int l ,int r)
{
    t[u].l = {l ,r};
    if(l == r) return;
    int mid = (l + r) >> 1;
    build(u << 1 ,l ,mid) ,build(u << 1 | 1 ,mid + 1 ,r);
}

int query(int u ,int l ,int r)
{
	if(t[u].l >= l && t[u].r <= r)
		return t[u].val;
	int mid = (l + r) >> 1 ,cnt = 0;
	if(l <= mid) cnt = query(u << 1 ,l ,r);
	if(r > mid) cnt = max(cnt ,query(u << 1 | 1 ,l ,r));
	return cnt;
}

void add(int u ,int x ,int v)
{
	if(t[u].l == t[u].r) t[u].val = v;
	else
	{
		int mid = (t[u].l + t[u].r) >> 1;
		if(x <= mid) add(u << 1 ,x ,v);
		else add(u << 1 | 1 ,x ,v);
		t[u].val = max(t[u << 1].val ,t[u << 1 | 1].val);
	}
}

int main()
{
    scanf("%d%d" ,&m ,&q);
    build(1 ,1 ,m);
    while(m--)
    {
    	char op[2];
    	int x;
    	scanf("%s%d" ,op ,&x);
    	if(*op == 'Q')
    	{
    		last = query(1 ,n - x + 1 ,n);
    		printf("%d\n" ,last);
		}
		if(*op == 'A')
		{
			++n;
			add(1 ,n,(last + x) % q);
		}
	}
	return 0;
}
2022/10/25 13:13
加载中...