Cod sursa(job #2774163)

Utilizator Raresr14Rosca Rares Raresr14 Data 9 septembrie 2021 22:49:14
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.55 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int n,q,a,b,x;
struct aint{
    int val,st,dr,ok=0;
}A[400002];
void build(int nod, int st, int dr){
    if(st==dr){
        A[nod].val=A[nod].st=A[nod].dr=1;
    }else{
        int mid=(st+dr)/2;
        build(nod*2,st,mid);
        build(nod*2+1,mid+1,dr);
        A[nod].val=A[nod].st=A[nod].dr=A[nod*2].val+A[nod*2+1].val;
    }
}
void add(int nod, int st, int dr){
    if(st>=a&&dr<=b){
        A[nod].val=A[nod].st=A[nod].dr=0;
        A[nod].ok=1;
    }else{
        int mid=(st+dr)/2;
        if(A[nod].ok==1){
            A[nod*2].val=A[nod*2].st=A[nod*2].dr=0;
            A[nod*2].ok=1;
            A[nod*2+1].val=A[nod*2+1].st=A[nod*2+1].dr=0;
            A[nod*2+1].ok=1;
            A[nod].ok=0;
        }
        if(A[nod].ok==2){
            A[nod*2].val=A[nod*2].st=A[nod*2].dr=mid-st+1;
            A[nod*2].ok=2;
            A[nod*2+1].val=A[nod*2+1].st=A[nod*2+1].dr=dr-mid;
            A[nod*2+1].ok=2;
            A[nod].ok=0;
        }
        if(a<=mid)
            add(nod*2,st,mid);
        if(b>mid)
            add(nod*2+1,mid+1,dr);

            A[nod].val=max(A[nod*2].val,A[nod*2+1].val);
            A[nod].val=max(A[nod].val,A[nod*2].dr+A[nod*2+1].st);
            if(A[nod].val==dr-st+1){
                A[nod].st=A[nod].dr=A[nod].val;
            }else{
                int ok1=0,ok2=0;
                if(A[nod*2+1].val==dr-mid)
                    A[nod].dr=A[nod*2].dr+A[nod*2+1].val,ok1=1;
                if(A[nod*2].val==mid-st+1)
                    A[nod].st=A[nod*2].val+A[nod*2+1].st,ok2=1;
                if(!ok1)
                    A[nod].dr=A[nod*2+1].dr;
                if(!ok2)
                    A[nod].st=A[nod*2].st;
            }

    }
}
void dlt(int nod, int st, int dr){
    if(st>=a&&dr<=b){
        A[nod].val=A[nod].st=A[nod].dr=dr-st+1;
        A[nod].ok=2;
    }else{
        int mid=(st+dr)/2;
        if(A[nod].ok==1){
            A[nod*2].val=A[nod*2].st=A[nod*2].dr=0;
            A[nod*2].ok=1;
            A[nod*2+1].val=A[nod*2+1].st=A[nod*2+1].dr=0;
            A[nod*2+1].ok=1;
            A[nod].ok=0;
        }
        if(A[nod].ok==2){
            A[nod*2].val=A[nod*2].st=A[nod*2].dr=mid-st+1;
            A[nod*2].ok=2;
            A[nod*2+1].val=A[nod*2+1].st=A[nod*2+1].dr=dr-mid;
            A[nod*2+1].ok=2;
            A[nod].ok=0;
        }
        if(a<=mid)
            dlt(nod*2,st,mid);
        if(b>mid)
            dlt(nod*2+1,mid+1,dr);
            A[nod].val=max(A[nod*2].val,A[nod*2+1].val);
            A[nod].val=max(A[nod].val,A[nod*2].dr+A[nod*2+1].st);
            if(A[nod].val==dr-st+1){
                A[nod].st=A[nod].dr=A[nod].val;
            }else{
                int ok1=0,ok2=0;
                if(A[nod*2+1].val==dr-mid)
                    A[nod].dr=A[nod*2].dr+A[nod*2+1].val,ok1=1;
                if(A[nod*2].val==mid-st+1)
                    A[nod].st=A[nod*2].val+A[nod*2+1].st,ok2=1;
                if(!ok1)
                    A[nod].dr=A[nod*2+1].dr;
                if(!ok2)
                    A[nod].st=A[nod*2].st;
            }

    }
}
int main(){
    fin>>n>>q;
    build(1,1,n);
    for(;q--;){
        fin>>x;
        if(x==1){
            fin>>a>>b;
            b=a+b-1;
            add(1,1,n);
        }
        if(x==2){
            fin>>a>>b;
            b=a+b-1;
            dlt(1,1,n);
        }
        if(x==3)
            fout<<A[1].val<<"\n";
    }
    return 0;
}