Cod sursa(job #2634671)

Utilizator irimia_alexIrimia Alex irimia_alex Data 11 iulie 2020 22:13:14
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <stdio.h>
#define NMAX 100000

using namespace std;

struct str {
    int max, left, right;

};

str arb[17 * NMAX] = { 0 };
int update[17 * NMAX] = { 0 };

int max(int a, int b) {
    return (a > b) ? a : b;
}

void buildArb(int i, int j, int k=1) {
    if (i == j) {
        arb[k] = { 1,1,1 };
        return;
    }
    int m = i + (j - i) / 2;
    buildArb(i, m, 2 * k);
    buildArb(m + 1, j, 2 * k + 1);
    int size = j - i + 1;
    arb[k] = { size,size,size };
}

void updateArb(int left, int right, int val, int i, int j, int k = 1) {
    if (update[k] != 0) {
        int size;
        update[2 * k] = update[2 * k + 1] = update[k];
        if (update[k] == -1)
            size = j - i + 1;
        else size = 0;
        arb[k] = { size,size,size };
        update[k] = 0;
    }
    if (i > right || j < left)return;
    if (i >= left && j <= right) {
        int size;
        if (val == -1)
            size = j - i + 1;
        else size = 0;
        arb[k] = { size,size,size };
        update[2 * k] = update[2 * k + 1] = val;
        return;
    }
    int m = i + (j - i) / 2;
    updateArb(left, right, val, i, m, 2 * k);
    updateArb(left, right, val, m + 1, j, 2 * k + 1);
    str x = arb[2 * k], y = arb[2 * k + 1];
    arb[k].max = max(max(x.max, y.max), x.right + y.left);
    arb[k].left = (x.left == m - i + 1) ? x.left + y.left : x.left;
    arb[k].right = (y.right == j - m) ? y.right + x.right : y.right;
}

int getMax() {
    return arb[1].max;
}


int main()
{
    FILE* fin, * fout;
    fin=fopen("hotel.in", "r");
    fout=fopen("hotel.out", "w");
    int n, p;
    fscanf(fin, "%i %i\n", &n, &p);
    buildArb(1, n);
    while (p--) {
        int t;
        fscanf(fin, "%i", &t);
        if (t == 3)
            fprintf(fout,"%i\n", getMax());
        else {
            int x, y;
            fscanf(fin,"%i %i", &x, &y);
            if (t == 1)
                updateArb(x, x + y - 1, 1, 1, n);
            else 
                updateArb(x, x + y - 1, -1, 1, n);
        }
    }


    return 0;
}