Cod sursa(job #3363013)

Utilizator CorvinJudge0Corvin Judge CorvinJudge0 Data 13 august 2026 13:02:50
Problema Hotel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

ifstream fin("hotel.in");
ofstream fout("hotel.out");

struct NODE {
    int secv,pref,suf;
};

int v[200001];
vector <NODE> segtree(400001);
vector <int> lazy(400001);
int n,m;

void update_plus(int a,int b,int start,int end,int node) {
    int mij=(start+end)/2;
    if (a<=start && end<=b) {
        lazy[node]=1;
    }
    if (a<=mij) {
        update_plus(a,b,start,mij,2*node);;
    }
    if (b>mij) {
        update_plus(a,b,mij+1,end,2*node+1);
    }
}

void update_minus(int a,int b,int start,int end,int node) {
    int mij=(start+end)/2;
    if (a<=start && end<=b) {
        lazy[node]=0;
        if (node<n) {
            lazy[2*node]=1;
            lazy[2*node+1]=1;
        }
    }
    if (a<=mij) {
        update_plus(a,b,start,mij,2*node);;
    }
    if (b>mij) {
        update_plus(a,b,mij+1,end,2*node+1);
    }
}

int query(int start,int end,int node) {
    int mij=(start+end)/2;
    if (start==end) {
        if (lazy[node]==1) {
            segtree[node].pref=1;
            segtree[node].suf=1;
            segtree[node].secv=1;
        }
        return segtree[node].secv;
    }else {
        if (lazy[node]==1) {
            lazy[2*node]=1;
            lazy[2*node+1]=1;
            lazy[node]=0;
        }
    }
    query(start,mij,2*node);
    query(mij,end,2*node+1);
    segtree[node].pref=segtree[2*node].pref;
    segtree[node].suf=segtree[2*node+1].suf;
    
    segtree[node].secv=segtree[2*node].secv;
    if (segtree[node].secv<segtree[2*node+1].secv) {
        segtree[node].secv=segtree[2*node+1].secv;
    }
    if (segtree[2*node].suf+segtree[2*node+1].pref>segtree[node].secv) {
        segtree[2*node].suf+segtree[2*node+1].pref==segtree[node].secv;
    }
}

int main() {
    fin>>n>>m;
    for (int i=1;i<=n;i++) {
        fin >> v[i];
    }

    int aux=log2(n);
    n=pow(2,(aux+1));

    for (int i=1;i<=m;i++) {
        int cer;
        fin >> cer;
        if (cer==1) {
            int a,b;
            fin >> a >> b;
            update_plus(a,b,1,n,1);
        }else if (cer==2){
            int a,b;
            fin >> a >> b;
            update_minus(a,b,1,n,1);
        }else {
            fout << query(1,n,1);
        }
    }
    return 0;
}