线段树mle求助 没用while
查看原帖
线段树mle求助 没用while
59285
封禁用户楼主2020/10/29 10:54
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#define LL long long
using namespace std;

LL M,D;
LL maxn[800005];
LL tag;
char s[2];
LL mem;
LL x;
const LL INF=-0x7fffffff;


LL ls(LL p)
{
	return p<<1;
}

LL rs(LL p)
{
	return p<<1|1;
}

void push_up(LL p)
{
	maxn[p]=max(maxn[ls(p)]%D,maxn[rs(p)]%D)%D;
}

void adder(LL p,LL nl,LL nr,LL l,LL r,LL k)
{
	if(nl<=l&&nr>=r)
	{
		maxn[p]=k%D;
		return;
	}
	
	LL mid=(l+r)>>1;
	if(nl<=mid)
	adder(ls(p),nl,nr,l,mid,k);
	if(nr>mid)
	adder(rs(p),nl,nr,mid+1,r,k);
	push_up(p);
}

LL query(LL p,LL nl,LL nr,LL l,LL r)
{
	if(nl<=l&&nr>=r)
	{
		return maxn[p]%D;
	}
	
	LL temp=INF%D;
	LL mid=(l+r)>>1;
	if(nl<=mid)
	temp=max(temp,query(ls(p),nl,nr,l,mid));
	if(nr>mid)
	temp=max(temp,query(rs(p),nr,nr,mid+1,r));
	return temp%D;
}

int main()
{
    scanf("%lld%lld",&M,&D);
    for(int i=1;i<=M;i++)
    {
   	    scanf("%s %lld",s,&x);
   	    if(s[0]=='Q')
	     {
	     	if(x==0)
	     	mem=0;
	     	else mem=query(1,tag-x+1,tag,1,M);
	     	printf("%lld\n",mem);
		 }
		else
		 {
		 	x+=mem;
		 	x%=D;
		 	tag++;
		 	adder(1,tag,tag,1,M,x);
		 } 
    }
  
	
    return 0;	
}



数组开的也不是很大,也足够了 但为什么就是一直mle呢。。。。
2020/10/29 10:54
加载中...