Cod sursa(job #1497944)

Utilizator SilviuIIon Silviu SilviuI Data 7 octombrie 2015 20:02:20
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <stdio.h>
#define nmax 100010
using namespace std;
struct date { int l,st,dr; };
int n,m,i,tip,v[3*nmax],x,y;
date arb[3*nmax];
inline int max(int a,int b) { if (a>b) return a; else return b; }
inline int min(int a,int b) { if (a<b) return a; else return b; }
inline void lazypropagation(int nod,int st,int dr)
{
    if (v[nod]==0) return;
    if (v[nod]==2) arb[nod].l=arb[nod].st=arb[nod].dr=dr-st+1; else
        arb[nod].l=arb[nod].st=arb[nod].dr=0;
    if (st!=dr) v[nod*2]=v[nod],v[nod*2+1]=v[nod];
    v[nod]=0;
}
void init()
{
    arb[1].l=arb[1].st=arb[1].dr=n; v[2]=2; v[3]=2;
}
void update(int nod,int st,int dr,int val)
{
    lazypropagation(nod,st,dr);
    if (st>=x && dr<=y) {
        if (val==2) {
            arb[nod].l=arb[nod].st=arb[nod].dr=dr-st+1;
        } else
            arb[nod].l=arb[nod].st=arb[nod].dr=0;
        if (st!=dr) v[nod*2]=val,v[nod*2+1]=val;
    } else {
        int m=(st+dr)/2;
        if (x<=m) update(nod*2,st,m,val);
        if (y>m) update(nod*2+1,m+1,dr,val);
        lazypropagation(nod*2,st,m); lazypropagation(nod*2+1,m+1,dr);
        arb[nod].l=max(max(arb[nod*2].l,arb[nod*2+1].l),arb[nod*2].dr+arb[nod*2+1].st);
        if (arb[nod*2].l==m-st+1) arb[nod].st=arb[nod*2+1].st+arb[nod*2].l; else
            arb[nod].st=arb[nod*2].st;
        if (arb[nod*2+1].l==dr-m) arb[nod].dr=arb[nod*2+1].l+arb[nod*2].dr; else
            arb[nod].dr=arb[nod*2+1].dr;
    }
}
int main() {
freopen("1.in","r",stdin);
//freopen("hotel.out","w",stdout);
scanf("%d %d",&n,&m); init();
for (i=1;i<=m;i++) {
    scanf("%d",&tip);
    if (tip==1 || tip==2) {
        scanf("%d %d",&x,&y); y=x+y-1; update(1,1,n,tip);
    } else printf("%d\n",arb[1].l);
}
return 0;
}