Cod sursa(job #2464991)

Utilizator anamariatoaderAna Toader anamariatoader Data 29 septembrie 2019 11:48:10
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <fstream>

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

int n,m,i,a,b,c,val;
struct numar{
    int nr,left,right,lazy;
}ai[300005];

void update(int nod, int st, int dr){
    if(a<=st && dr<=b){
        if(val==1)
            ai[nod].nr=ai[nod].left=ai[nod].right=dr-st+1;
        else{
            ai[nod].nr=0;
            ai[nod].left=0;
            ai[nod].right=0;
        }
        ai[nod].lazy=1;
        return;
    }
    int mid=(st+dr)/2;
    if(ai[nod].lazy){
        ai[nod].lazy=0;
        if(ai[nod].nr!=0){
            ai[2*nod].nr=ai[2*nod].left=ai[2*nod].right=mid-st+1;
            ai[2*nod+1].nr=ai[2*nod+1].left=ai[2*nod+1].right=dr-mid;
        }
        else{
            ai[2*nod].nr=ai[2*nod+1].nr=0;
            ai[2*nod].left=ai[2*nod].right=0;
            ai[2*nod+1].left=ai[2*nod+1].right=0;
        }
        ai[2*nod].lazy=ai[2*nod+1].lazy=1;
    }
    if(mid>=a)
        update(2*nod,st,mid);
    if(mid<b)
        update(2*nod+1,mid+1,dr);
    ai[nod].nr=max(ai[2*nod].nr,ai[2*nod+1].nr);
    ai[nod].nr = max(ai[nod].nr, ai[2*nod].right + ai[2*nod+1].left);
    ai[nod].left = ai[2*nod].left;
    if(ai[2*nod].left == mid-st+1)
        ai[nod].left += ai[2*nod+1].left;
    ai[nod].right = ai[2*nod+1].right;
    if(ai[2*nod+1].right == dr-mid)
        ai[nod].right += ai[2*nod].right;
}

int main(){
    fin>>n>>m;
    a=1, b=n, val=1;
    update(1,1,n);
    for(i=1;i<=m;i++){
        fin>>c;
        if(c==3){
            int Max=ai[1].nr;
            Max=max(Max, max(ai[1].left,ai[1].right));
            fout<<Max<<'\n';
            continue;
        }
        fin>>a>>b;
        b=a+b-1;
        if(c==1)
            val=0;
        else
            val=1;
        update(1,1,n);
    }
    return 0;
}