Cod sursa(job #1512075)

Utilizator serbanSlincu Serban serban Data 27 octombrie 2015 18:04:35
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 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;

void update(int node, int L, int R, int A, int B) {
    if(A <= L && R <= B) {
        h[node] = (R - L + 1) * val;
        l[node] = h[node];
        r[node] = h[node];
        return ;
    }

    int mij = (R - L) / 2 + L;
    if(h[node] == R - L + 1) {
        int k = mij - L + 1;
        l[node * 2] = k;
        r[node * 2] = k;
        h[node * 2] = k;
        k = R - mij;
        l[node * 2 + 1] = k;
        r[node * 2 + 1] = k;
        h[node * 2 + 1] = k;
    }
    else if(h[node] == 0) {
        l[node * 2] = r[node * 2] = h[node * 2] = 0;
        l[node * 2 + 1] = r[node * 2 + 1] = h[node * 2 + 1] = 0;
    }
    if(A <= mij) update(node * 2, L, mij, A, B);
    if(mij < B) update(node * 2 + 1, mij + 1, R, A, B);

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

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

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

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;
    update(1, 1, n, 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 - 1;
            val = 0;
            update(1, 1, n, j, k);
        }

        else if(tip == 2) {
            fscanf(f, "%d %d", &j, &k);
            k += j - 1;
            val = 1;
            update(1, 1, n, j, k);
        }

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