Cod sursa(job #598908)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 27 iunie 2011 15:23:58
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb

#include <cstdio>
#include <fstream>
#include <algorithm>

using namespace std;

#define N 456789

int n,m,a[N],b[N],c[N];

void pr (int k,int s,int d){
	
	if(s==d){
		a[k]=b[k]=c[k]=1;
		return;}
	int md=(s+d)>>1;
	pr(k<<1,s,md);
	pr((k<<1)+1,md+1,d);
	a[k]=b[k]=c[k]=d-s+1;
	
	}
	
	void up (int k,int s,int d,int i,int j,int x){
		
		if(s<=i&&d>=j){
			a[k]=b[k]=c[k]=x*(j-i+1);
			return;}
		int md=(i+j)>>1;
		if(a[k]==0){
			a[k<<1]=b[k<<1]=c[k<<1]=0;
			a[(k<<1)+1]=b[(k<<1)+1]=c[(k<<1)+1]=0;
			}
		if(a[k]==j-i+1){
			a[k<<1]=b[k<<1]=c[k<<1]=md-i+1;
			a[(k<<1)+1]=b[(k<<1)+1]=c[(k<<1)+1]=j-md;
			}
		if(s<=md)
			up(k<<1,s,d,i,md,x);
		if(d>md)
			up((k<<1)+1,s,d,md+1,j,x);
		b[k]=b[k<<1];
		if(b[k<<1]==md-i+1)
			b[k]+=b[(k<<1)+1];
		c[k]=c[(k<<1)+1];
		if(c[(k<<1)+1]==j-md)
			c[k]+=c[k<<1];
		a[k]=max(c[k<<1]+b[(k<<1)+1],max(a[k<<1],a[(k<<1)+1]));
		
		}

int main ()
{
	
	ifstream in ("hotel.in");
	freopen ("hotel.out","w",stdout);
	in>>n>>m;
	pr(1,1,n);
	for(int z,x,y;m;--m){
		in>>z;
		switch(z){
			case 1:{in>>x>>y;
				up(1,x,x+y-1,1,n,0);
				break;}
			case 2:{in>>x>>y;
			up(1,x,x+y-1,1,n,1);
			break;}
			case 3:printf("%d\n",a[1]);
			}
		}
	
	return 0;}