Cod sursa(job #790307)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 20 septembrie 2012 20:32:43
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <fstream>

#define MAX 131072
#define leftSon (nod << 1)
#define rightSon ((nod << 1) + 1)

using namespace std;

struct ArboreIntervale
{
    int left, right, best, use;
}aInt[4 * MAX];

int N, M, tip, a, b;

void Build(int nod, int l, int r)
{
    aInt[nod].left = aInt[nod].right = aInt[nod].best = r - l + 1;
    aInt[nod].use = -1;
    if(l == r) return;
    int m = (l + r) >> 1;
    Build(leftSon, l, m);
    Build(rightSon, m + 1, r);
}




void Update(int nod, int l, int r, int a, int b, int tip)
{
    if(a <= l && r <= b)
    {
        aInt[nod].use = tip;
        aInt[nod].left = aInt[nod].right = aInt[nod].best = tip * (r - l + 1);
        return;
    }
    int m = (l + r) >> 1;
    if(aInt[nod].use != -1)
    {
        Update(leftSon, l, m, l, m, aInt[nod].use);
        Update(rightSon, m + 1, r, m + 1, r, aInt[nod].use);
        aInt[nod].use = -1;
    }
    if(a <= m) Update(leftSon, l, m, a, b, tip);
    if(b > m) Update(rightSon, m + 1, r, a, b, tip);
    aInt[nod].best = max(max(aInt[leftSon].best, aInt[rightSon].best), aInt[leftSon].right + aInt[rightSon].left);
    if(aInt[leftSon].left == m - l + 1) aInt[nod].left = aInt[leftSon].left + aInt[rightSon].left;
    else aInt[nod].left = aInt[leftSon].left;
    if(aInt[rightSon].right == r - m) aInt[nod].right = aInt[rightSon].right + aInt[leftSon].right;
    else aInt[nod].right = aInt[rightSon].right;
}


int main()
{
    ifstream in("hotel.in"); ofstream out("hotel.out");
    in>>N>>M;
    Build(1, 1, N);
    for(int i = 1; i <= M; i++)
    {
        in>>tip;
        if(tip == 3)
        {
            out<<aInt[1].best<<"\n";
            continue;
        }
        in>>a>>b;
        Update(1, 1, N, a, a + b - 1, 1 - tip % 2);
    }
    in.close(); out.close();
    return 0;
}