Cod sursa(job #1512043)

Utilizator serbanSlincu Serban serban Data 27 octombrie 2015 17:17:51
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <bits/stdc++.h>
#define L first
#define R second

using namespace std;

int h[500000];
int l[500000];
int r[500000];
int val, poz;

void updateA(int node, int L, int R) {
    if(L == R) {
        h[node] = val;
        l[node] = val;
        r[node] = val;
        return ;
    }
    int mij = (R - L) / 2 + L;
    if(L <= poz && poz <= R) {
        if(poz <= mij)
            updateA(node * 2, L, mij);
        else updateA(node * 2 + 1, mij + 1, R);

        h[node] = 0;

        l[node] = l[node * 2];
        r[node] = r[node * 2 + 1];

        if(r[node * 2] && l[node * 2 + 1]) {

            if(l[node * 2] == mij - L + 1)
                l[node] = l[node * 2] + l[node * 2 + 1];

            if(r[node * 2 + 1] == R - mij)
                r[node] = r[node * 2 + 1] + r[node * 2];

            h[node] = r[node * 2] + l[node * 2 + 1];
        }

        h[node] = max(h[node], h[node * 2]);
        h[node] = max(h[node], h[node * 2 + 1]);
        h[node] = max(h[node], l[node]);
        h[node] = max(h[node], r[node]);
    }
}

int main()
{
    FILE *f = fopen("hotel.in", "r");
    FILE *g = fopen("hotel.out", "w");

    int n, m;
    fscanf(f, "%d %d", &n, &m);

    val = 1;
    for(int i = 1; i <= n; i ++) {
        poz = i;
        updateA(1, 1, n);
    }

    int tip, j, k;
    for(int i = 1; i <= m; i ++) {

        fscanf(f, "%d", &tip);

        if(tip == 1) {
            fscanf(f, "%d %d", &j, &k);
            k += j;
            val = 0;
            for(int l = j; l < k; l ++) {
                poz = l;
                updateA(1, 1, n);

            }
        }

        else if(tip == 2) {
            fscanf(f, "%d %d", &j, &k);
            k += j;
            val = 1;
            for(int l = j; l < k; l ++) {
                poz = l;
                updateA(1, 1, n);
            }
        }

        else fprintf(g, "%d\n", h[1]);
    }
    return 0;
}