#include <bits/stdc++.h>
using namespace std;
#define DEBUG
class File;
class RAM;
inline string to_string(unsigned short);
class File
{
public:
unsigned short addres;
unsigned short len;
unsigned short num;
File(unsigned short addres, unsigned short len, unsigned short num) :
addres(addres), len(len), num(num) {}
};
class RAM
{
public:
vector<File> files;
unsigned short file_num;
unsigned short m;
RAM(unsigned short m) : files(), file_num(1), m(m) {}
inline string alloc(unsigned short);
inline string erase(unsigned short);
inline void defragment();
};
int main()
{
#ifndef DEBUG
ios::sync_with_stdio(false);
cin.tie(NULL);
#endif
unsigned short t;
unsigned short m;
string op_type;
unsigned op_arg;
cin >> t >> m;
RAM ram(m);
for(unsigned short i=0;i<t;++i)
{
cin >> op_type;
if(op_type == "alloc")
{
cin >> op_arg;
cout << ram.alloc(op_arg) << endl;
}
#ifdef DEBUG
else if(op_type == "break")
return 0;
#endif
else if(op_type == "erase")
{
cin >> op_arg;
string str = ram.erase(op_arg);
cout << str << (str == "" ? "" : "\n") << flush;
}
else
ram.defragment();
}
return 0;
}
inline string to_string(unsigned short n)
{
ostringstream oss;
oss << n;
return oss.str();
}
inline string RAM::alloc(unsigned short len)
{
if(files.empty())
{
if(len <= m)
{
files.insert(files.begin(), File(1, len, file_num));
return to_string(file_num++);
}
else
return "NULL";
}
if(files.front().addres-1 >= len)
{
files.insert(files.begin(), File(1, len, file_num));
return to_string(file_num++);
}
for(vector<File>::iterator ptr1=files.begin()+1,ptr2=ptr1+1,end=files.end();
ptr2<end;++ptr1,++ptr2)
{
if(ptr2->addres-(ptr1->addres+ptr1->len) >= len)
{
files.insert(ptr2, File(ptr1->addres + ptr1->len, len, file_num));
return to_string(file_num++);
}
}
if(m-(files.back().addres+files.back().len)+1 >= len)
{
files.insert(files.end(), File(files.back().addres+files.back().len, len, file_num));
return to_string(file_num++);
}
else return "NULL";
}
inline string RAM::erase(unsigned short file_num)
{
for(vector<File>::iterator ptr=files.begin(),end=files.end();ptr!=end;++ptr)
if(ptr->num == file_num)
{
files.erase(ptr);
return "";
}
return "ILLEGAL_ERASE_ARGUMENT";
}
inline void RAM::defragment()
{
if(files.empty())
return;
files.front().addres = 1;
for(vector<File>::iterator ptr1=files.begin()+1,ptr2=ptr1+1,end=files.end();
ptr2<end;++ptr1,++ptr2)
{
ptr2->addres = ptr1->addres + ptr1->len;
}
if(files.size() > 1)
files.back().addres = (files.end() - 2)->addres + (files.end() - 2)->len;
}