Pagini recente » Cod sursa (job #55439) | Cod sursa (job #501964) | Cod sursa (job #1290876) | Cod sursa (job #1721785) | Cod sursa (job #1738139)
#include <fstream>
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);
}
}
}f("hotel.in");
ofstream g("hotel.out");
int n,m,tip,i,cur,a,b;
struct aint
{
int secv;
int st;
int dr;
inline void init(int cost)
{
secv=st=dr=cost;
}
inline void act(aint a,aint b,int q,int w)
{
secv=max(a.dr+b.st,max(a.secv,b.secv));
st=(a.st==q?q+b.st:a.st);
dr=(b.dr==w?a.dr+w:b.dr);
}
}arb[1<<18];
inline void update(int nod,int st,int dr)
{
if(a<=st&&dr<=b)
{
arb[nod].init((dr-st+1)*cur);
return ;
}
int mid=(st+dr)>>1;
int left=nod<<1;
int right=(nod<<1)+1;
if(arb[nod].secv==dr-st+1)
{
arb[left].init(mid-st+1);
arb[right].init(dr-mid);
}
else if(!arb[nod].secv)
{
arb[left].init(0);
arb[right].init(0);
}
if(a<=mid) update(left,st,mid);
if(mid<b) update(right,mid+1,dr);
arb[nod].act(arb[left],arb[right],mid-st+1,dr-mid);
}
int main()
{
f>>n>>m;
arb[1]={n,n,n};
for(i=1;i<=m;++i)
{
f>>tip;
if(tip==3) g<<arb[1].secv<<'\n';
else
{
f>>a>>b;
b+=a-1;
cur=(tip==2);
update(1,1,n);
}
}
return 0;
}