Cod sursa(job #2461916)

Utilizator anamariatoaderAna Toader anamariatoader Data 26 septembrie 2019 15:43:05
Problema Hotel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 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;
}ai[300005];

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