Cod sursa(job #1076270)

Utilizator iarbaCrestez Paul iarba Data 9 ianuarie 2014 23:45:55
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <cstdio>
#define dim 262145
using namespace std;
int ll[dim],lm[dim],lr[dim],v,st,sf,n,m,i,k;
int maxim2(int a, int b)
{if(a>b){return a;}else{return b;}}
int maxim3(int a, int b, int c)
{return maxim2(maxim2(a,b),c);}
void query(){}
void update(int nod, int left, int right)
{
	if(left==right){ll[nod]=v;lm[nod]=v;lr[nod]=v;}
	else{
		int mid=(left+right)/2;
		if(st<=mid){update(nod*2,left,mid);}
		if(mid<sf){update(nod*2+1,mid+1,right);}
		lm[nod]=maxim3(lm[nod*2],lm[nod*2+1],lr[nod*2]+ll[nod*2+1]);//find lm
		if(lm[nod*2]==mid-left+1){ll[nod]=lm[nod*2]+ll[nod*2+1];}	//find llcombined
		else{ll[nod]=ll[nod*2];}									//find ll
		if(lm[nod*2+1]==right-mid){lr[nod]=lm[nod*2+1]+lr[nod*2];}//find lrcombined
		else{lr[nod]=lr[nod*2+1];}									//find lr
		}
}
int main()
{
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	scanf("%d%d",&n,&m);
	st=1;sf=n;v=1;update(1,1,n);
	for(i=1;i<=m;i++){
		scanf("%d",&k);
		if(k==3){printf("%d\n",lm[1]);}
		else{scanf("%d%d",&st,&v);sf=st+v-1;v=(k==2);update(1,1,n);}
					 }
	
return 0;
}