### AC Code:
```cpp
#include<cstdio>
#include<set>
using namespace std;
int T, opt, len;
set<int> se;
signed main()
{
scanf("%d", &T);
while (T--){
scanf("%d%d", &opt, &len);
if (opt==1){
if (se.count(len)) puts("Already Exist");
else se.insert(len);
}
else {
if (se.empty()) puts("Empty");
else if (se.count(len)){
printf("%d\n", len);
se.erase(len);
}
else {
auto it1 = se.lower_bound(len);
if(it1==se.begin()){
printf("%d\n",*it1);
se.erase(it1);
}else if(it1==se.end()){
printf("%d\n",*(--it1));
se.erase(it1);
}else{
auto it2 = it1; it2--;
if((*it1)-len<len-(*it2)){
printf("%d\n",*it1);
se.erase(it1);
}else{
printf("%d\n",*it2);
se.erase(it2);
}
}
}
}
}
return 0;
}
```
by TCIC_4294967296 @ 2024-04-20 14:57:46
@[TCIC_4294967296](/user/1155762)
原理解释:
1. 如果最接近的大于len的木材是现有的里的最小的,就直接删掉最小的
1. 如果找不到最接近的大于等于len的木材,就删掉现有的中的最大的
1. 果同时存在比len大和小的木材,删除长度差小的,如果长度差相同优先删除短的
by TCIC_4294967296 @ 2024-04-20 15:03:20
谢谢啦
by qyz123123 @ 2024-04-20 15:04:01
@[TCIC_4294967296](/user/1155762) 请问我的代码错在哪里呢?谢谢
by qyz123123 @ 2024-04-20 15:07:31
@[qyz123123](/user/658726)
在 ```int len1=(*(--it)), len2=(*it);``` 中,有两处错误:
1. 如果it是se.begin(),使用```--```会RE。
1. 即使没有RE,在给len1赋值时的```--it```操作会使it本身向左移一个位置,而赋值len2时的it依旧是在赋值len1时被改变过的it,所以len1和len2代表的是同一个位置,会WA。
by TCIC_4294967296 @ 2024-04-20 16:21:22