Cod sursa(job #1211641)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 22 iulie 2014 23:00:00
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <fstream>
#define DIMN 100005

using namespace std;

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

struct arbint {
    int v;
    int l;
    int r;
} A[4*DIMN];

int a,b,nr,n,m,op;

void init (int nod, int st, int dr) {
    if(st==dr)
    {
        A[nod].v = A[nod].l = A[nod].r = 1;
        return ;
    }
    int mid = (st+dr)/2;
    init(2*nod, st, mid);
    init(2*nod+1, mid+1, dr);
    A[nod].v = A[nod].l = A[nod].r = A[2*nod].v + A[2*nod+1].v;
}

void update (int nod, int st, int dr) {
    if (a<=st && dr<=b) {
        if (nr==1)
            A[nod].v = A[nod].l = A[nod].r = 0;
        else
            A[nod].v = A[nod].l = A[nod].r = dr - st + 1;
        return;
    }
    if (st == dr)
        return;
    int mid = (st+dr)/2;
    if (A[nod].v == 0)
        A[2*nod].v = A[2*nod].l = A[2*nod].r = A[2*nod+1].v = A[2*nod+1].l = A[2*nod+1].r = 0;
    if (A[nod].v == dr-st+1)
        A[2*nod].v = A[2*nod].l = A[2*nod].r = mid-st+1, A[2*nod+1].v = A[2*nod+1].l = A[2*nod+1].r = dr-mid;

    if (a<=mid)
        update (2*nod, st, mid);
    if (mid<b)
        update (2*nod+1, mid+1, dr);
    A[nod].v = max(A[2*nod].v,max(A[2*nod+1].v,A[2*nod].r+A[2*nod+1].l));
    if (A[2*nod].l == mid-st+1)
        A[nod].l = A[2*nod].l + A[2*nod+1].l;
    else
        A[nod].l = A[2*nod].l;
    if (A[2*nod+1].r == dr-mid)
        A[nod].r = A[2*nod+1].r + A[2*nod].r;
    else
        A[nod].r = A[2*nod+1].r;
}

int main () {
    f >> n >> m;
    init(1,1,n);
    for (; m; --m) {
        f >> op;
        if (op == 1) {
            f >> a;
            f >> b;
            b = a + b - 1;
            nr = 1;
            update (1,1,n);
        }
        else
        if (op == 2) {
            f >> a;
            f >> b;
            b = a + b - 1;
            nr = 0;
            update (1,1,n);
        }
        else
            g << A[1].v << "\n";
    }
    return 0;
}