Cod sursa(job #309480)

Utilizator SleepyOverlordPatcas Csaba SleepyOverlord Data 30 aprilie 2009 13:22:16
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
//Code by Patcas Csaba
//Time complexity: O(m * n)
//Space complexity: O(n)
//Method: Brute pe biti
//Working time: 5 minutes

#include <stdio.h>
#include <ctype.h>
#include <vector>
#include <string> 
#include <set> 
#include <map> 
#include <iostream> 
#include <sstream> 
#include <numeric> 
#include <algorithm> 
#include <cmath> 
#include <queue> 
#include <bitset> 

using namespace std;

#define in_file "hotel.in"
#define out_file "hotel.out"

#define VI vector <int>
#define FORN(i,n) for(int i=0;i<n;++i)
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define S size()
#define B begin() 
#define E end() 
#define X first
#define Y second
#define PB push_back
#define MP make_pair
#define ALL(x) x.begin(),x.end()
#define repeat do{ 
#define until(x) }while(!(x)); 

int n, p;
vector <long long> a; 

int main()
{
	FILE* fin=fopen(in_file,"r");
	FILE* fout=fopen(out_file,"w");
	fscanf(fin,"%d%d",&n,&p);
	a.resize((n>>6)+1);
	FORN(q,p)
	{
		int op;
		fscanf(fin,"%d",&op);
		if (op==3)
		{
			int now=0, best=0;
			FOR(i,0,n-1)
				if (a[i>>6]&(1LL<<(i&63))) now=0;
				else 
				{
					++now;
					best=max(best,now);
				}
			fprintf(fout,"%d\n",best);
		}
		else
		{
			int x, y;
			fscanf(fin,"%d%d",&x,&y);
			if (op==1) 
				FOR(i,x-1,x+y-2) 
					if (!(i&63) && i+64<=x+y-2) 
					{
						a[i>>6]=0xffffffffffffffff;
						i+=63;
					}
					else a[i>>6]|=1LL<<(i&63);
			else 
			{
				FOR(i,x-1,x+y-2) 
					if (!(i&63) && i+64<=x+y-2) 
					{
						a[i>>6]=0;
						i+=63;
					}
					else a[i>>6]&=~(1LL<<(i&63));
			}
		}
	}
	fclose(fin);
	fclose(fout);
	
	return 0;
}