Cod sursa(job #2871713)

Utilizator Xutzu358Ignat Alex Xutzu358 Data 15 martie 2022 16:21:59
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <bits/stdc++.h>
using namespace std;

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

int n,m,p;
int i;
int a,b;
int op;
struct SegmentTree{
    int sufix,prefix,maxseq;
}arbint[400005];

void verify_child(int pos, int st, int dr, int mij) {
    if (arbint[pos].maxseq==0) {
        arbint[2*pos].maxseq = arbint[2*pos].sufix = arbint[2*pos].prefix = 0;
        arbint[2*pos+1].maxseq = arbint[2*pos+1].sufix = arbint[2*pos+1].prefix = 0;
    }
    if (arbint[pos].maxseq==(dr-st+1)) {
        arbint[2*pos].maxseq = arbint[2*pos].sufix = arbint[2*pos].prefix = (mij-st+1);
        arbint[2*pos+1].maxseq = arbint[2*pos+1].sufix = arbint[2*pos+1].prefix = (dr-mij);
    }
}

void check_in(int pos, int st, int dr) {
    if (a<=st && dr<=b) {
        arbint[pos].sufix = arbint[pos].prefix = arbint[pos].maxseq = 0;
        return;
    }
    if (st!=dr && dr>=a && b>=st) {
        int mij = (st+dr)/2;
        verify_child(pos,st,dr,mij);
        check_in(2*pos,st,mij);
        check_in(2*pos+1,mij+1,dr);
        arbint[pos].maxseq = max(max(arbint[2*pos].maxseq,arbint[2*pos+1].maxseq),arbint[2*pos].sufix+arbint[2*pos+1].prefix);
        arbint[pos].prefix = arbint[2*pos].prefix;
        arbint[pos].sufix = arbint[2*pos+1].sufix;
        if (arbint[2*pos].maxseq==(mij-st+1)) arbint[pos].prefix = arbint[2*pos].maxseq+arbint[2*pos+1].prefix;
        if (arbint[2*pos+1].maxseq==(dr-mij)) arbint[pos].sufix = arbint[2*pos+1].maxseq+arbint[2*pos].sufix;
    }
}

void check_out(int pos, int st, int dr) {
    if (a<=st && dr<=b) {
        arbint[pos].sufix = arbint[pos].prefix = arbint[pos].maxseq = dr-st+1;
        return;
    }
    if (st!=dr && dr>=a && b>=st) {
        int mij = (st+dr)/2;
        verify_child(pos,st,dr,mij);
        check_out(2*pos,st,mij);
        check_out(2*pos+1,mij+1,dr);
        arbint[pos].maxseq = max(max(arbint[2*pos].maxseq,arbint[2*pos+1].maxseq),arbint[2*pos].sufix+arbint[2*pos+1].prefix);
        arbint[pos].prefix = arbint[2*pos].prefix;
        arbint[pos].sufix = arbint[2*pos+1].sufix;
        if (arbint[2*pos].maxseq==(mij-st+1)) arbint[pos].prefix = arbint[2*pos].maxseq+arbint[2*pos+1].prefix;
        if (arbint[2*pos+1].maxseq==(dr-mij)) arbint[pos].sufix = arbint[2*pos+1].maxseq+arbint[2*pos].sufix;
    }
}

int main()
{
    f >> n >> p;
    a=1; b=n;
    check_out(1,1,n);
    for (int w=1;w<=p;w++) {
        f >> op;
        if (op==1) {
            f >> i >> m;
            a = i; b = m+i-1;
            check_in(1,1,n);
        }
        else if (op==2) {
            f >> i >> m;
            a = i; b = m+i-1;
            check_out(1,1,n);
        }
        else {
            g << arbint[1].maxseq << '\n';
        }
    }
    return 0;
}