Cod sursa(job #940934)

Utilizator dariusdariusMarian Darius dariusdarius Data 17 aprilie 2013 15:27:54
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
int n,x,y;
struct Nod
{
    int med,st,dr;
    void set(int val)
    {
        med=st=dr=val;
    }
}aint[500000];
inline int max(int a,int b,int c)
{
    int ans=a;
    if(ans<b) ans=b;
    if(ans<c) ans=c;
    return ans;
}
void init(int nod, int st, int dr)
{
    aint[nod].set(dr-st+1);
	if(st==dr)
		return;
	int med=(st+dr)>>1;
	init(2*nod,st,med);
	init(2*nod+1,med+1,dr);
}
void update1(int nod, int st, int dr)
{
	if(st>=x && dr<=y)
    {
        aint[nod].set(0);
        return;
    }
	int med=(st+dr)/2;
	if(aint[nod].med==dr-st+1)
	    aint[2*nod  ].set(med-st+1),
        aint[2*nod+1].set(dr-med);
	if(aint[nod].med==0)
	    aint[2*nod].set(0),
	    aint[2*nod+1].set(0);
	if(med>=x)
		update1(2*nod,st,med);
	if(med<y)
		update1(2*nod+1,med+1,dr);

	aint[nod].st=aint[2*nod].st;
	if(aint[2*nod].st==med-st+1)
		aint[nod].st+=aint[2*nod+1].st;

	aint[nod].dr=aint[2*nod+1].dr;
	if(aint[2*nod+1].med==dr-med)
		aint[nod].dr+=aint[2*nod].dr;

	aint[nod].med= max(
                 aint[2*nod].med,
                 aint[2*nod+1].med,
                 aint[2*nod].dr+aint[2*nod+1].st
                    );
}

void update2(int nod, int st, int dr)
{
	if(st>=x && dr<=y)
	{
	    aint[nod].set(dr-st+1);
        return;
	}
	int med=(st+dr)/2;
	if(aint[nod].med==0)
		aint[2*nod].set(0),
		aint[2*nod+1].set(0);

	if(aint[nod].med==dr-st+1)
		aint[2*nod].set(med-st+1),
		aint[2*nod+1].set(dr-med);
	if(med>=x)
		update2(2*nod, st, med);
	if(med<y)
		update2(2*nod+1, med+1, dr);

	aint[nod].st=aint[2*nod].st;
	if(aint[2*nod].st==med-st+1)
		aint[nod].st+=aint[2*nod+1].st;

	aint[nod].dr=aint[2*nod+1].dr;
	if(aint[2*nod+1].dr==dr-med)
		aint[nod].dr+=aint[2*nod].dr;

	aint[nod].med=max(
               aint[2*nod].med,
               aint[2*nod+1].med,
               aint[2*nod].dr+aint[2*nod+1].st
               );
}
int main()
{
	int i,op,p;
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	scanf("%d%d",&n,&p);
	init(1,1,n);
	for(i=1;i<=p;++i)
	{
		scanf("%d",&op);
		if(op==1)
		{
			scanf("%d%d",&x,&y);
			y+=x-1;
			update1(1,1,n);
		}
		if(op==2)
		{
			scanf("%d%d",&x,&y);
			y+=x-1;
			update2(1,1,n);
		}
		if(op==3)
            printf("%d\n",aint[1].med);
	}
	return 0;
}