分块0pts求调
查看原帖
分块0pts求调
1023793
yaodiguoan楼主2024/4/23 19:56

记录

#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
namespace quickread{
	inline int read(){
		__int128 x=0;bool f=1;char ch=getchar();
		while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
		while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
		return x*f;
	}
	inline void write(__int128 x){
	    if(x<0){putchar('-');x=-x;}
	    if(x>9)write(x/10);
	    putchar(x%10+'0');
	}
	inline char readchar(){
		char ch=getchar();
		while(ch!='A'&&ch!='Q') ch=getchar();
		return ch;
	}
}
using namespace quickread;
const int N=1e6+10;
const __int128 inf=0x3f3f3f3f3f3f3f3f;
int n,m,q,len;
__int128 mod,t,a[N],st[N],ed[N],pos[N],val[N];
void build(){
	memset(a,-0x3f,sizeof(a));
	len=sqrt(q)/2;
	m=n/len;
	if(m*len!=n) m++;
	for(int i=1;i<=m;i++){
		st[i]=ed[i-1]+1;
		ed[i]=ed[i-1]+len;
	}
	for(int i=1;i<=m;i++){
		val[i]=-inf;
		for(int j=st[i];j<=ed[i];j++){
			pos[j]=i;
			val[i]=max(val[i],a[j]);
		}
	}
}
void update(__int128 k){
	a[++n]=k%mod;
	val[pos[n]]=max(val[pos[n]],k);
}
int query(int l,int r){
	int lt=pos[l],rt=pos[r];
	__int128 ans=-inf;
	if(lt==rt){
		for(int i=l;i<=r;i++) ans=max(ans,a[i]);
	}else{
		for(int i=lt+1;i<=rt;i++) ans=max(ans,val[i]);
		for(int i=l;i<=ed[lt];i++) ans=max(ans,a[i]);
	}
	return ans;
}
signed main(){
	q=read(),mod=read();
	build();
	while(q--){
		char opt=readchar();
		__int128 x=read();
		if(opt=='A') {
			update(x+t);
			t=0;
		}else{
			t=query(n-x+1,n)%mod;
			write(t),putchar('\n');
		}
	}
//    write(a[1]),putchar(' '),write(a[2]);a
	return 0;
}
2024/4/23 19:56
加载中...