Pagini recente » Cod sursa (job #2976019) | Cod sursa (job #2377219) | Cod sursa (job #2145225) | Cod sursa (job #3234420) | Cod sursa (job #1646001)
#include <fstream>
#include <cstdio>
#define nmax 265000
using namespace std;
class instream {
public:
instream() {}
instream(const char *file_name) {
input_file=fopen(file_name, "r");
cursor=0;
fread(buffer,SIZE,1,input_file);
}
inline instream &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<<20;
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 ad;};
int n,t;
nod v[nmax];
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) {
v[nod].ad=val;
v[nod].lst=v[nod].ldr=v[nod].ln=((val==1)?0:dr-st+1);
return;
}
int ls=nod<<1,rs=ls+1,mid=(st+dr)>>1;
if (v[nod].ad) {
v[ls].ad=v[rs].ad=v[nod].ad;
v[ls].lst=v[ls].ldr=v[ls].ln=((v[nod].ad==1)?0:mid-st+1);
v[rs].lst=v[rs].ldr=v[rs].ln=((v[nod].ad==1)?0:dr-mid);
v[nod].ad=0;
}
if (p<=mid)
update(ls,st,mid,p,q,val);
if (q>=mid+1)
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);
}
instream f("hotel.in");
ofstream g("hotel.out");
int main()
{
int p,q,op;
f>>n>>t;
update(1,1,n,1,n,2);
for (;t;t--) {
f>>op;
if (op==3) {
g<<v[1].ln<<'\n';
continue;
}
f>>p>>q;
update(1,1,n,p,p+q-1,op);
}
return 0;
}