Cod sursa(job #1472283)

Utilizator MaligMamaliga cu smantana Malig Data 16 august 2015 21:09:43
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 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];

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,1);
    //cout<<'\n';
    while (P--) {
        short tip;
        f>>tip;
        if (tip==3) {
            g<<arb[1].best<<'\n';
        }
        else {
            int x,m;
            f>>x>>m;
            if (tip==1) {
                update(1,1,N,x,x+m-1,0);
                //cout<<'\n';
            }
            else {
                update(1,1,N,x,x+m-1,1);
                //cout<<'\n';
            }
        }
    }
    f.close();g.close();
    return 0;
}

void update(int nod,int st,int dr,int a,int b,int val) {
    if (st==dr) {
        arb[nod].best=arb[nod].left=arb[nod].right=val;
    }
    else {
        int mij=(st+dr)>>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);
        }
        if (arb[(nod<<1)].right+arb[(nod<<1)+1].left==dr-st+1) {
            arb[nod].left=arb[nod].right=arb[nod].best=dr-st+1;
        }
        else {
            if (arb[(nod<<1)].best==mij-st+1) {
                arb[nod].left=arb[(nod<<1)].left+arb[(nod<<1)+1].left;
            }
            else {
                arb[nod].left=arb[(nod<<1)].left;
            }
            if (arb[(nod<<1)+1].best==dr-(mij+1)+1) {
                arb[nod].right=arb[(nod<<1)].right+arb[(nod<<1)+1].right;
            }
            else {
                arb[nod].right=arb[(nod<<1)+1].right;
            }
            arb[nod].best=maxim(arb[(nod<<1)].right+arb[(nod<<1)+1].left,arb[(nod<<1)].best,arb[(nod<<1)+1].best);
        }
    }
    //cout<<st<<' '<<dr<<' '<<a<<' '<<b<<' '<<arb[nod].left<<' '<<arb[nod].best<<' '<<arb[nod].right<<'\n';
}

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;
}