Cod sursa(job #1645988)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 10 martie 2016 14:37:52
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <fstream>
#include <cstdio>
#define nmax 263000
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<<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 ad;};
int n,t;
nod v[nmax];


void build(int nod,int st,int dr)
{

    v[nod].lst=v[nod].ldr=v[nod].ln=dr-st+1;

    if (st==dr)
        return;

    int ls=nod*2,rs=nod*2+1,mid=(st+dr)>>1;
    build(ls,st,mid);
    build(rs,mid+1,dr);
}

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*2,rs=nod*2+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 i,j,p,q,op;
    instream cin("hotel.in");
    ofstream g("hotel.out");
    f>>n>>t;
    update(1,1,n,1,n,2);

    for (;t;t--) {
        f>>op;
        if (op==3) {
            g<<v[1].ln<<'\n';
        }
        else {
            f>>p>>q;
            update(1,1,n,p,p+q-1,op);
        }
    }
    return 0;
}