Cod sursa(job #1260040)

Utilizator misinoonisim necula misino Data 10 noiembrie 2014 20:28:31
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include<fstream>

#define N 100100

using namespace std;

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

int n,m,i,op,x,y;

struct arbint{int sol,st,dr;}aint[N * 4];

inline void update(int nod,int li,int ls,int st,int dr,int val){
    if(st <= li && ls <= dr){
        aint[nod].st = aint[nod].dr = aint[nod].sol = val * (ls - li + 1);

        return ;
    }

    int mij = (li + ls) >> 1;

    if(aint[nod].sol == 0)
        aint[nod << 1].sol = aint[nod << 1].st = aint[nod << 1].dr = aint[(nod << 1) | 1].sol = aint[(nod << 1) | 1].st = aint[(nod << 1) | 1].dr = 0;
    if(aint[nod].sol == ls - li + 1)
        aint[nod << 1].sol = aint[nod << 1].st = aint[nod << 1].dr = mij - li + 1,
        aint[(nod << 1) | 1].sol = aint[(nod << 1) | 1].st = aint[(nod << 1) | 1].dr = ls - mij;

    if(st <= mij)
        update(nod << 1, li, mij, st, dr, val);
    if(mij < dr)
        update((nod << 1) | 1, mij + 1, ls, st, dr, val);

    if(aint[nod << 1].st == mij - li + 1)
        aint[nod].st = aint[nod << 1].st + aint[(nod << 1) | 1].st;
    else
        aint[nod].st = aint[nod << 1].st;

    if(aint[(nod << 1) | 1].dr == ls - mij)
        aint[nod].dr = aint[nod << 1].dr + aint[(nod << 1) | 1].dr;
    else
        aint[nod].dr = aint[(nod << 1) | 1].dr;

    aint[nod].sol = max(max(aint[nod << 1].sol, aint[(nod << 1) | 1].sol), aint[nod << 1].dr + aint[(nod << 1) | 1].st);
}

int main()
{
    f >> n >> m;

    update(1, 1, n, 1, n, 1);

    for(i = 1; i <= m; ++i)
    {
        f >> op;

        if(op == 1)
            f >> x >> y,
            update(1, 1, n, x, x + y - 1, 0);
        else
            if(op == 2)
                f >> x >> y,
                update(1, 1, n, x, x + y - 1, 1);
            else
                g << aint[1].sol << '\n';
    }

    return 0;
}