每个区间加入内部时要满足前面有b个空位,后面有f个空位,且该车长为len,要同时有加入和删除操作。
因为操作数为100 这就可以用vector存所有的已覆盖区间,然后从前往后扫描看是否有空。
#include <queue>
#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define rep(i,n) for(int (i)=0;(i)<(n);i++)
#define Rep(i,n) for(int (i)=1;(i)<=(n);i++)
#define rep1(i,x,y) for(int (i)=x;(i)<=y;i++)
const int inf = 1e9;
const int N = 110;
typedef pair<int,int> pii;
pii id[N];
vector<pii> a;
int L,b,f;
int main()
{
scanf("%d %d %d",&L,&b,&f);
a.push_back(make_pair(-inf,-b-1));
a.push_back(make_pair(L+f,inf));
int Q;
scanf("%d",&Q);
for(int g=1;g<=Q;g++){
int cmd,x;
scanf("%d %d",&cmd,&x);
if(cmd==2){
a.erase(find(a.begin(),a.end(),id[x]));
} else {
int ok = 0;
for(int i=1;i<a.size();i++){
if(a[i-1].second+b+x+f<=a[i].first-1){
int fir=a[i-1].second+b+1;
int sec=fir+x-1;
id[g] = make_pair(fir,sec);
a.push_back(id[g]);
sort(a.begin(),a.end());
printf("%d\n",fir);
ok = 1;
break;
}
}
if(!ok) printf("-1\n");
}
}
return 0;
}