题目:
http://www.lydsy.com/JudgeOnline/problem.php?id=1012简单的线段树。
先离线确定最后数列的长度,再一个个按顺序操作。
注意OJ上用cin cout会re,要用scanf和printf。
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;
const int MaxM=200500;

int m,d,n=0,now=0,a[MaxM][2];
int t[4*MaxM];

void add(int i,int l,int r,int x,int v)


{
if (l==r)

{
t[i]=v;
return;
}
int m=(l+r)>>1;
if (x<=m)

{
add(2*i,l,m,x,v);
}
else

{
add(2*i+1,m+1,r,x,v);
}
t[i]=max(t[2*i],t[2*i+1]);
}

int getmax(int i,int l,int r,int vl,int vr)


{
if (l==vl && r==vr)

{
return t[i];
}
int m=(l+r)>>1;
if (vr<=m)

{
return getmax(2*i,l,m,vl,vr);
}
if (vl>=m+1)

{
return getmax(2*i+1,m+1,r,vl,vr);
}
return max(getmax(2*i,l,m,vl,m),getmax(2*i+1,m+1,r,m+1,vr));
}

void init()


{
scanf("%d%d ",&m,&d);
memset(t,0,sizeof(t));
for (int i=0;i<m;i++)

{
char x;
scanf(" %c ",&x);
if (x=='A')

{
a[i][0]=1;
n++;
}
else

{
a[i][0]=0;
}
scanf("%d",&a[i][1]);
}
}

int main()


{
init();
int tt=0;
for (int i=0;i<m;i++)

{
if (a[i][0]==0)

{
tt=getmax(1,1,n,now-a[i][1]+1,now);
printf("%d\n",tt);
}
else

{
now++;
add(1,1,n,now,(a[i][1]+tt)%d);
}
}
return 0;
}
