不是哥们
查看原帖
不是哥们
817925
whileAK楼主2024/9/2 22:00

本来想水一道绿的,结果线段树调了一个小时还是0分,感觉自己太唐了。记录。

急了啊所以求助大神QAQ

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void rd(int &p){
	p=0;int f(0);char z=getchar();
	while(z>'9'||z<'0'){if(z=='-')f^=1;z=getchar();}
	while(z>='0'&&z<='9')p=(p<<1)+(p<<3)+z-'0',z=getchar();
	if(f)p=-p;
}
void rdl(ll &p){
	p=0;int f(0);char z=getchar();
	while(z>'9'||z<'0'){if(z=='-')f^=1;z=getchar();}
	while(z>='0'&&z<='9')p=(p<<1)+(p<<3)+z-'0',z=getchar();
	if(f)p=-p;
}
const int N=1e6+50;
int T,n(0),a[N],ans(0),mod;
struct hhoppitree{
	int l,r,val;
	void cl(int L,int R){
		l=L,r=R,val=-2e9-7;
	}
}t[N];
void build(int l,int r,int p){
	t[p].cl(l,r);
	if(l==r)return;
	int mid=l+r>>1;
	build(l,mid,p<<1);build(mid+1,r,p<<1|1);
}
void up(int p){
	t[p].val=max(t[p<<1].val,t[p<<1|1].val);
}
void add(int x,int z,int p){
	if(t[p].l==t[p].r){
		t[p].val=z;return;
	}int mid=t[p].l+t[p].r>>1;
	if(x<=mid)add(x,z,p<<1);
	else add(x,z,p<<1|1);
	up(p);
}
int ask(int l,int r,int p){
	if(t[p].l>=l&&t[p].r<=r)return t[p].val;
	int mid=t[p].l+t[p].r>>1,e(-2e9);
	if(l<=mid)e=ask(l,r,p<<1);
	if(r>mid)e=max(e,ask(l,r,p<<1|1));
	return e;
}
int main(){
	rd(T);rd(mod);
	char op;int x;
	build(1,T,1);
	while(T--){
		scanf("%c",&op);rd(x);
		if(op=='A'){
			//x=(x%mod+mod)%mod;
			x=1ll*(x+ans)%mod;a[++n]=x;
			add(n,x,1);
		}
		else{
			printf("%d\n",ans=ask(n-x+1,n,1));
		}
	}
	return 0;
}
2024/9/2 22:00
加载中...