这个题和Hotel差不多
把整个树的区间增加b+f就可以直接处理了
查询的时候查询车长+b+f,更新的时候还是更新车长、、
把出车的标号理解成第几次进入的车了、WA了一个小时有木有、、、
#include<stdio.h>
#include<string.h>
#define MAXN 201000
#define lch p<<1
#define rch p<<1|1
#define mid (t[p].l+t[p].r)>>1
struct node
{
int l,r;
int lsum,rsum,sum;
int flag;
int len;
void getsum() {lsum=rsum=sum=(flag?len:0);}
}t[MAXN<<2];
struct carin
{
int l,r;
}car[105];
int max(int a,int b) {return a>b?a:b;}
void construct(int l,int r,int p)
{
t[p].l=l,t[p].r=r,t[p].flag=-1;
t[p].len=r-l+1;
t[p].getsum();
if(l==r) return ;
int m=mid;
construct(l,m,lch);
construct(m+1,r,rch);
}
void pushdown(int p)
{
t[lch].flag=t[rch].flag=t[p].flag;
t[p].flag=-1;
t[lch].getsum();
t[rch].getsum();
}
void pushup(int p)
{
t[p].sum=max(t[lch].sum,t[rch].sum);
t[p].sum=max(t[p].sum,t[lch].rsum+t[rch].lsum);
t[p].lsum=t[lch].lsum;
if(t[lch].lsum==t[lch].len) t[p].lsum+=t[rch].lsum;
t[p].rsum=t[rch].rsum;
if(t[rch].rsum==t[rch].len) t[p].rsum+=t[lch].rsum;
}
void modify(int l,int r,int op,int p)
{
if(t[p].l==l&&t[p].r==r)
{
t[p].flag=op;
t[p].getsum();
return ;
}
if(t[p].flag!=-1) pushdown(p);
int m=mid;
if(r<=m) modify(l,r,op,lch);
else if(l>m) modify(l,r,op,rch);
else modify(l,m,op,lch),modify(m+1,r,op,rch);
pushup(p);
}
int query(int x,int p)
{
if(t[p].l==t[p].r&&x==1) return t[p].l;
if(t[p].flag!=-1) pushdown(p);
if(x<=t[lch].sum) return query(x,lch);
else if(t[lch].rsum+t[rch].lsum>=x) return t[lch].r-t[lch].rsum+1;
else if(x<=t[rch].sum) return query(x,rch);
else return -1;
}
int main()
{
int op,x;
int len,b,f,n;
while(scanf("%d%d%d",&len,&b,&f)!=EOF)
{
//int cnt=1;
construct(0,len+b+f-1,1);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&op,&x);
if(op==1)
{
int l=query(x+b+f,1);
if(l==-1) printf("-1\n");
else
{
printf("%d\n",l);
l+=b;
int r=l+x-1;
car[i].l=l,car[i].r=r;
modify(l,r,0,1);
}
}
else
modify(car[x].l,car[x].r,1,1);
}
}
return 0;
}