Cod sursa(job #3231430)

Utilizator catalinaionela77Catalina Ionela Florescu catalinaionela77 Data 26 mai 2024 13:28:51
Problema Hotel Scor 0
Compilator c-64 Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <stdio.h>

#define MAX_N 100001

int rooms[4 * MAX_N]; // Segment tree
int lazy[4 * MAX_N]; // Lazy propagation array

void update(int node, int start, int end, int left, int right, int val) {
    if (lazy[node] != 0) {
        rooms[node] += lazy[node];
        if (start != end) {
            lazy[2 * node] += lazy[node];
            lazy[2 * node + 1] += lazy[node];
        }
        lazy[node] = 0;
    }

    if (start > end || start > right || end < left)
        return;

    if (start >= left && end <= right) {
        rooms[node] += val;
        if (start != end) {
            lazy[2 * node] += val;
            lazy[2 * node + 1] += val;
        }
        return;
    }

    int mid = (start + end) / 2;
    update(2 * node, start, mid, left, right, val);
    update(2 * node + 1, mid + 1, end, left, right, val);
    rooms[node] = rooms[2 * node] + rooms[2 * node + 1];
}

int query(int node, int start, int end, int left, int right) {
    if (start > end || start > right || end < left)
        return 0;

    if (lazy[node] != 0) {
        rooms[node] += lazy[node];
        if (start != end) {
            lazy[2 * node] += lazy[node];
            lazy[2 * node + 1] += lazy[node];
        }
        lazy[node] = 0;
    }

    if (start >= left && end <= right)
        return rooms[node];

    int mid = (start + end) / 2;
    int p1 = query(2 * node, start, mid, left, right);
    int p2 = query(2 * node + 1, mid + 1, end, left, right);
    return (p1 + p2);
}

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

    int N, P;
    fscanf(fin, "%d %d", &N, &P);

    for (int i = 0; i < P; i++) {
        int op, start, M;
        fscanf(fin, "%d", &op);

        if (op == 1) {
            fscanf(fin, "%d %d", &start, &M);
            update(1, 1, N, start, start + M - 1, 1);
        } else if (op == 2) {
            fscanf(fin, "%d %d", &start, &M);
            update(1, 1, N, start, start + M - 1, -1);
        } else if (op == 3) {
            fprintf(fout, "%d\n", query(1, 1, N, 1, N));
        }
    }

    fclose(fin);
    fclose(fout);

    return 0;
}