Cod sursa(job #1478903)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 29 august 2015 21:52:03
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#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;
}