Cod sursa(job #1640278)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 8 martie 2016 16:48:04
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.02 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<iterator>
#include<bitset>
#include<algorithm>
#include<cmath>

using namespace std;

ifstream f("hotel.in");
ofstream g("hotel.out");

int V[100005], SQ[500], S[500], F[500], B[500], L[500];
int p, n, nrad;
int const oo = 1000000000;

void init()
{
    int i;

    nrad = sqrt(n);
    for(i=0; i<nrad; i++){
        S[i] = F[i] = B[i] = L[i] = nrad;
    }
    S[nrad] = F[nrad] = B[nrad] = L[nrad] = n - nrad*nrad;
}

void Update(int st, int dr, int val)
{
    int i, radst, raddr, k;
    radst = min((st-2)/nrad + 1, nrad + 1);
    raddr = min(dr/nrad, nrad);
    if(st == 1)
        radst = 0;

    for(i = radst; i < raddr; i++){
        SQ[i] = val;
        if(val == 1)
            S[i] = F[i] = B[i] = 0;
        if(val == 0)
            S[i] = F[i] = B[i] = nrad;
    }

    if((st-1)%nrad || st > nrad*nrad){
        if(SQ[radst - 1] >= 0)
            for(i=(radst - 1)*nrad + 1; i <= (radst - 1)*nrad + L[radst - 1]; i++)
                V[i] = SQ[radst - 1];
        SQ[radst - 1] = -1;

        for(i=st; i <= radst*nrad && i <= dr; i++)
            V[i] = val;

        S[radst-1] = 0;
        for(i=(radst - 1)*nrad + 1; !V[i] && i <= (radst - 1)*nrad + L[radst - 1]; i++)
            S[radst-1]++;

        B[radst-1] = S[radst-1]; k = 0;
        for( ; i <= (radst - 1)*nrad + L[radst - 1]; i++){
            if(!V[i])
                k++;
            else
                k = 0;
            B[radst-1] = max(B[radst-1], k);
        }

        F[radst-1] = 0;
        for(i=(radst - 1)*nrad + L[radst - 1]; i >= max(((radst - 1)*nrad + 1), 1) && !V[i]; i--)
            F[radst-1]++;
    }

    if(dr%nrad || dr > nrad){
        if(SQ[raddr] >= 0)
            for(i=raddr*nrad + 1; i <= raddr*nrad + L[raddr]; i++)
                V[i] = SQ[raddr];
        SQ[raddr] = -1;

        for(i=max(raddr*nrad + 1, st); i <= dr; i++)
            V[i] = val;

        S[raddr] = 0;
        for(i=raddr*nrad + 1; !V[i] && i <= raddr*nrad + L[raddr]; i++)
            S[raddr]++;

        B[raddr] = S[raddr]; k = 0;
        for( ; i <= raddr*nrad + L[raddr]; i++){
            if(!V[i])
                k++;
            else
                k = 0;
            B[raddr] = max(B[raddr], k);
        }

        F[raddr] = 0;
        for(i=raddr*nrad + L[raddr]; i >= (raddr*nrad + 1) && !V[i]; i--)
            F[raddr]++;
    }
}

void Query()
{
    int i, maxi = -oo, tempf = 0;
    for(i=0; i<=nrad; i++){
        maxi = max(maxi, max(tempf + S[i], B[i]));

        if(F[i] == L[i])
            tempf += F[i];
        else
            tempf = F[i];
    }

    g<<maxi<<"\n";
}

int main()
{
    int op, i, m;

    f>>n>>p;
    init();
    while(p--){
        f>>op;
        if(op == 1){
            f>>i>>m;
            Update(i, i + m - 1, 1);
        }
        if(op == 2){
            f>>i>>m;
            Update(i, i + m - 1, 0);
        }
        if(op == 3)
            Query();
    }
}