Pagini recente » Cod sursa (job #230209) | Cod sursa (job #2321434) | Cod sursa (job #466222) | Cod sursa (job #2929756) | Cod sursa (job #1478903)
#define nmax 100005
#include <fstream>
#include <cstdio>
using namespace std;
class InputReader {
public:
InputReader() {}
InputReader(const char *file_name) {
input_file = fopen(file_name, "r");
cursor = 0;
fread(buffer, SIZE, 1, input_file);
}
inline InputReader &operator >>(int &n) {
while(buffer[cursor] < '0' || buffer[cursor] > '9') {
advance();
}
n = 0;
while('0' <= buffer[cursor] && buffer[cursor] <= '9') {
n = n * 10 + buffer[cursor] - '0';
advance();
}
return *this;
}
private:
FILE *input_file;
static const int SIZE = 1 << 17;
int cursor;
char buffer[SIZE];
inline void advance() {
++ cursor;
if(cursor == SIZE) {
cursor = 0;
fread(buffer, SIZE, 1, input_file);
}
}
};
struct nod {int ln;int lst;int ldr;};
int n,t;
nod v[nmax*3];
void update(int nod,int st,int dr,int p,int q,int val)
{
if (q<st||p>dr)
return;
if (p<=st&&dr<=q) {
if (val==1)
v[nod].lst=v[nod].ldr=v[nod].ln=0; //Fills completely
else
v[nod].lst=v[nod].ldr=v[nod].ln=dr-st+1; //Erases everything
return;
}
int ls=nod*2,rs=nod*2+1,mid=(st+dr)>>1;
//If it hasn't arrived there
if (v[nod].ln==0) {
v[ls].lst=v[ls].ldr=v[ls].ln=0;
v[rs].lst=v[rs].ldr=v[ls].ln=0;
}
else
if (v[nod].ln==dr-st+1) {
v[ls].lst=v[ls].ldr=v[ls].ln=mid-st+1;
v[rs].lst=v[rs].ldr=v[rs].ln=dr-mid;
}
update(ls,st,mid,p,q,val);
update(rs,mid+1,dr,p,q,val);
v[nod].lst=v[ls].lst;
if (v[nod].lst==mid-st+1)
v[nod].lst+=v[rs].lst;
v[nod].ldr=v[rs].ldr;
if (v[nod].ldr==dr-mid)
v[nod].ldr+=v[ls].ldr;
v[nod].ln=max(v[ls].ln,v[rs].ln);
v[nod].ln=max(v[nod].ln,v[ls].ldr+v[rs].lst);
}
int main()
{
int i,j,p,q,op;
InputReader cin("hotel.in");
ofstream g("hotel.out");
cin>>n>>t;
update(1,1,n,1,n,2);
for (;t;t--) {
cin>>op;
if (op==3) {
g<<v[1].ln<<'\n';
}
else {
cin>>p>>q;
update(1,1,n,p,p+q-1,op);
}
}
return 0;
}