社区讨论

只有20分!其他全RE线段树?

P1198[JSOI2008] 最大数参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@ltfz9z08
此快照首次捕获于
2024/03/06 23:52
2 年前
此快照最后确认于
2024/03/06 23:55
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+10;
int n,m;
ll ma[N>>3],ans,mod,k;
inline ll max (ll a,ll b)
{
	return (a>b)?a:b; 
}
void add (int nn,ll s,int i,int l, int r)
{
	if (l==r) {
		ma[i]=s;
		return ;
	}
	int mid=(l+r)>>1;
	if (mid>=nn) add(nn,s,i<<1,l,mid);
	else add(nn,s,i<<1|1,mid+1,r);
	ma[i]=max(ma[i<<1],ma[i<<1|1]);
}
ll query (int l1,int r1,int i,int l,int r)
{
//	cout<<l1<<" "<<r1<<" "<<i<<endl;
	if (l>=l1 && r<=r1) return ma[i];
	int mid=(l+r)>>1;
	ll a=0,b=0;
	if (l1<=mid) a=query(l1,r1,i<<1,l,mid);
	if (r1>mid) b=query(l1,r1,i<<1|1,mid+1,r);
	return max(a,b); 
}
int main()
{
	scanf("%lld%lld",&m,&mod);
	for (int i=1;i<=m;i++) {
		char f;
		cin>>f;
		if (f=='Q') {
			scanf("%lld",&k);
			ans=query(n-k+1,n,1,1,m);
			printf("%lld\n",ans);
		}
		else {
			scanf("%lld",&k);
			add(++n,(k+ans)%mod,1,1,m);
		}
//		for (int j=1;j<=m*2;j++) cout<<ma[j]<<" ";
//		cout<<endl;
	}
	return 0;
}
/*
4 100
A 96
Q 1
A 97
Q 1
*/

回复

0 条回复,欢迎继续交流。

正在加载回复...