Cod sursa(job #2989511)

Utilizator DooMeDCristian Alexutan DooMeD Data 6 martie 2023 18:30:59
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e5;

struct Node {
    int ans = 0;
    int pref = 0;
    int suf = 0;
    int len = 0;
    int lazy = 0;
}aint[4*nmax+5];

Node Merge(Node left, Node right) {
    Node temp;
    temp.ans = max({left.ans, right.ans, left.suf + right.pref});
    temp.pref = left.pref;
    if(left.ans == left.len) temp.pref = max(temp.pref, left.len + right.pref);
    temp.suf = right.suf;
    if(right.ans == right.len) temp.suf = max(temp.suf, right.len + left.suf);
    temp.len = left.len + right.len;
    return temp;
}

void build(int node, int left, int right) {
    if(left == right) {
        aint[node].ans = 1;
        aint[node].pref = 1;
        aint[node].suf = 1;
        aint[node].len = 1;
        aint[node].lazy = 0;
        return;
    }
    int mid = (left + right) / 2;
    build(node*2, left, mid);
    build(node*2+1, mid+1, right);
    aint[node] = Merge(aint[node*2], aint[node*2+1]);
}

void push(int node, int left, int right) {
    if(aint[node].lazy == 0) return;
    if(aint[node].lazy == 1) {
        aint[node].ans = 0;
        aint[node].pref = 0;
        aint[node].suf = 0;
    }
    else if(aint[node].lazy == 2) {
        aint[node].ans = aint[node].len;
        aint[node].pref = aint[node].len;
        aint[node].suf = aint[node].len;
    }
    if(left != right) {
        aint[node*2].lazy = aint[node].lazy;
        aint[node*2+1].lazy = aint[node].lazy;
    }
    aint[node].lazy = 0;
    return;
}

void update(int node, int left, int right, int st, int dr, int type) {
    push(node, left, right);
    if(right < st or left > dr) return;
    if(st <= left and right <= dr) {
        aint[node].lazy = type;
        push(node, left, right);
        return;
    }
    int mid = (left + right) / 2;
    update(node*2, left, mid, st, dr, type);
    update(node*2+1, mid+1, right, st, dr, type);
    aint[node] = Merge(aint[node*2], aint[node*2+1]);
}

int main() {
    ifstream f("hotel.in");
    ofstream g("hotel.out");

    int n, q; f >> n >> q;
    build(1, 1, n);
    for(int i=1; i<=q; i++) {
        int type; f >> type;
        if(type == 1 or type == 2) {
            int pos, cnt; f >> pos >> cnt;
            update(1, 1, n, pos, pos+cnt-1, type);
        }
        else g << aint[1].ans << "\n";
    }
    return 0;
}