Cod sursa(job #1472287)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 16 august 2015 21:31:20
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.64 kb
#include<iostream>
#include<fstream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<bitset>
#include<cstring>
#include<queue>

#define ull unsigned long long
#define ll long long
#define pb push_back
#define FOR(a,b,c) for (int a=b;a<=c; ++a)
#define ROF(a,b,c) for (int a=b;a>=c; --a)

using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int N,P;

struct elem {
    int left=0,best=0,right=0;
}arb[262150];
// arb[i].best= lungimea celui mai mare interval de camere libere pentru nodul i
// arb[i].left= lungimea celui mai mare interval de camere libere care incepe in st
// arb[i].right= lungimea celui mai mare interval de camere libere care se termina in dr

void update(int,int,int,int,int,int);
inline int maxim(int,int,int);

int main()
{
    f>>N>>P;
    update(1,1,N,1,N,2); // fac toate camerele libere
    while (P--) {
        short tip;
        f>>tip;
        if (tip==3) {
            g<<arb[1].best<<'\n';
        }
        else {
            int x,m;
            f>>x>>m;
            update(1,1,N,x,x+m-1,tip);
        }
    }
    f.close();g.close();
    return 0;
}

void update(int nod,int st,int dr,int a,int b,int val) { // update de interval pe arbore cu lazy update
    if (a<=st && dr<=b) {
        if (val==2) {
            arb[nod].best=arb[nod].left=arb[nod].right=dr-st+1;
        }
        else {
            arb[nod].best=arb[nod].left=arb[nod].right=0;
        }
    }
    else {
        int mij=(st+dr)>>1;
        if (arb[nod].best==0) {
            arb[(nod<<1)].left=arb[(nod<<1)].right=arb[(nod<<1)].best=arb[(nod<<1)+1].left=arb[(nod<<1)+1].best=arb[(nod<<1)+1].right=0;
        }
        else if (arb[nod].best==dr-st+1) {
            arb[(nod<<1)].left=arb[(nod<<1)].right=arb[(nod<<1)].best=mij-st+1;
            arb[(nod<<1)+1].left=arb[(nod<<1)+1].best=arb[(nod<<1)+1].right=dr-(mij+1)+1;
        }
        if (a<=mij) {
            update((nod<<1),st,mij,a,b,val);
        }
        if (mij<b) {
            update((nod<<1)+1,mij+1,dr,a,b,val);
        }
        arb[nod].left=arb[(nod<<1)].left;
        if (arb[(nod<<1)].best==mij-st+1) {
            arb[nod].left+=arb[(nod<<1)+1].left;
        }
        arb[nod].right=arb[(nod<<1)+1].right;
        if (arb[(nod<<1)+1].best==dr-(mij+1)+1) {
            arb[nod].right+=arb[(nod<<1)].right;
        }
        arb[nod].best=maxim(arb[(nod<<1)].right+arb[(nod<<1)+1].left,arb[(nod<<1)].best,arb[(nod<<1)+1].best);
    }
}

inline int maxim(int a,int b, int c) {
    if (a>=c && a>=b) {
        return a;
    }
    if (b>=a && b>=c) {
        return b;
    }
    return c;
}