Cod sursa(job #2871702)

Utilizator Xutzu358Ignat Alex Xutzu358 Data 15 martie 2022 15:56:10
Problema Hotel Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.14 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 check_in(int pos, int st, int dr) {
    if (a<=st && dr<=b) {
        arbint[pos].sufix = arbint[pos].prefix = arbint[pos].maxseq = 0;
    }
    if (st!=dr && dr>=a && b>=st) {
        int mij = (st+dr)/2;
        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;
    }
    if (st!=dr && dr>=a && b>=st) {
        int mij = (st+dr)/2;
        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;
}