线段树模拟链表
#include<cstdio>
#include<iostream>
#include<cstring>
#include<map>
using namespace std;
typedef __int64 LL;
const int N=2e5+10;
#define ll o<<1
#define rr o<<1|1
#define mid (l+r)/2
int clo[N<<2][2];
int L,R,Vl,Vr;
void pushdown(int l,int r,int o){
for(int i=0;i<2;i++){
if(!clo[o][i])continue;
clo[ll][i]=clo[o][i];
clo[rr][i]=clo[o][i];
clo[o][i]=0;
}
}
void update(int l,int r,int o){
if(L<=l&&r<=R){
clo[o][0]=Vl;clo[o][1]=Vr;return ;
}
pushdown(l,r,o);
if(L<=mid)update(l,mid,ll);
if(R>mid)update(mid+1,r,rr);
}
int ll0[N],rr0[N];
void query(int l,int r,int o,int x){
if(l==r){
ll0[l]=clo[o][0],rr0[r]=clo[o][1];
return ;
}
pushdown(l,r,o);
if(x<=mid)query(l,mid,ll,x);
else query(mid+1,r,rr,x);
}
int id[N],st[N],ed[N],cnt,blo[N],num[N];
int vis[N];
void hor(int l,int r){
rr0[l]=r;ll0[r]=l;
}
int h,m,n;
int s,e;
int fun(int l,int r){
if(l<=r){
L=l,R=r;
update(1,h,1);
}
else {
L=l,R=e;
update(1,h,1);
L=s,R=r;
update(1,h,1);
}
}
int gun(int x){
if(x>e)return s;
if(x<s)return e;
return x;
}
int ok(int a,int b){
if(a==b-1)return 0;
if(a==e&&b==s)return 0;
return 1;
}
void del(int t){
num[blo[t]]--;
if(!num[blo[t]]){
//printf("del%d %d %d %d %d\n",t,ll0[t],rr0[t],s,e);
return ;
}
s=st[blo[t]],e=ed[blo[t]];
//printf("del%d %d %d %d %d\n",t,ll0[t],rr0[t],s,e);
hor(ll0[t],rr0[t]);
Vl=ll0[t],Vr=rr0[t];
fun(gun(ll0[t]+1),gun(rr0[t]-1));
}
void add(int t){
num[blo[t]]++;
s=st[blo[t]],e=ed[blo[t]];
if(num[blo[t]]==1){
ll0[t]=rr0[t]=t;
//printf("add%d %d %d %d %d\n",t,ll0[t],rr0[t],s,e);
Vl=Vr=t;
if(e-s+1!=1)fun(gun(t+1),gun(t-1));
}
else {
query(1,h,1,t);
//printf("add%d %d %d %d %d\n",t,ll0[t],rr0[t],s,e);
hor(ll0[t],t);
hor(t,rr0[t]);
Vl=ll0[t],Vr=t;
if(ok(ll0[t],t))fun(gun(ll0[t]+1),gun(t-1));
Vl=t;Vr=rr0[t];
if(ok(t,rr0[t]))fun(gun(t+1),gun(rr0[t]-1));
}
}
map<int,int> mp;
int main(){
#ifdef DouBi
freopen("in.cpp","r",stdin);
#endif // DouBi
while(scanf("%d%d%d",&h,&m,&n)!=EOF){
memset(id,0,sizeof(id));
cnt=0;
int pre=1;
for(int i=0;i<h;i++)if(!id[i]){
cnt++;
st[cnt]=pre;
int j=i;
while(!id[j]){
id[j]=pre++;
j=(j+m)%h;
}
ed[cnt]=pre-1;
num[cnt]=ed[cnt]-st[cnt]+1;
for(int j=st[cnt];j<=ed[cnt];j++){
hor(j,j+1);
blo[j]=cnt;
}
hor(ed[cnt],st[cnt]);
}
memset(vis,0,sizeof(vis));
mp.clear();
LL ans=0;
memset(clo,0,sizeof(clo));
for(int i=0;i<n;i++){
char op[2];int id1,t;scanf("%s",op);
if(op[0]=='-'){
scanf("%d",&id1);
t=mp[id1];
add(t);
vis[t]=0;
}
else {
scanf("%d%d",&id1,&t);
t=id[t];
if(!vis[t]){
mp[id1]=t;
vis[t]=1;
del(t);
}
else {
query(1,h,1,t);
if(rr0[t]>t)ans+=rr0[t]-t;
else {
ans+=ed[blo[t]]-t+rr0[t]-st[blo[t]]+1;
}
mp[id1]=rr0[t];
vis[rr0[t]]=1;
del(rr0[t]);
}
//printf("%d %d %d\n",id1,t,mp[id1]);
}
}
printf("%I64d\n",ans);
}
return 0;
}