又T又WA连样例了都不过!!!!!!!!!
#include<iostream>
using namespace std;
struct zt{
char ch;
int number;
}flag[50010];
int n,m,sum,wdwz[50010];//wdwz[50010]是存放士兵的位置,sum是围堵士兵个数
bool a[50010]={0};//房子的状态。1为被摧毁,2为平安无事
int main()
{
cin >> n >> m;
for(int i=1;i<=m;i++){
cin >> flag[i].ch;
if(flag[i].ch=='D'){//如果flag[i].ch是D
cin >> flag[i].number;//输入房子位置
a[flag[i].number]=1;//房子被摧毁
}else if(flag[i].ch='Q'){//如果flag[i].ch是Q
sum++;//士兵数++
cin >> flag[i].number;//输入围堵位置
wdwz[sum]=flag[i].number;//赋值给围堵位置
}else if(flag[i].ch='R'){//如果flag[i].ch是R
for(int j=i;j>=1;j--){//寻找上一个围堵的房子
if(flag[j].ch=='D'){//找到了上一个围堵的信息
a[flag[j].number]=0;//修复
break;//退出
}
}
}
}
for(int i=1;i<=sum;i++){//输出每一个被围堵的士兵能够到达的房子有几个
int ans=0;//累加器
if(a[wdwz[sum]]==1){//若士兵被围堵在摧毁了的房子中,那只能等死了。输出0
cout << "0" << endl;
continue;//跳过
}
for(int j=wdwz[sum];j>=1;j--){//从围堵位置开始,不断向后寻找能到达的房子有几个
if(j==1&&a[j]!=1){//特判边界
ans+=j;//加上数量
break;//退出
}
if(a[j]==1){//如果不能走了
ans+=j-1;//加上数量-1(因为不包括本身)
break;//退出
}
}
for(int j=wdwz[sum];j<=n;j++){//从围堵位置开始,不断向前寻找能到达的房子有几个
if(j==n&&a[j]!=1){//特判边界
ans+=j;//加上数量
break;//退出
}
if(a[j]==-1){//如果不能走了
ans+=j-1;//加上数量-1(因为不包括本身)
break;//退出
}
}
cout << ans+1 << endl;//输出数量+1(因为包括士兵所在房子)
}
return 0;
}