Cod sursa(job #1203919)

Utilizator teoionescuIonescu Teodor teoionescu Data 1 iulie 2014 15:49:40
Problema Hotel Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
//#include"stdafx.h"
#include<fstream>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
ifstream in("hotel.in");
ofstream out("hotel.out");
const int Nmax = 100001;
int N,P;
struct aint{ int size,upd,ans,left,right; } A[4*Nmax];
void getSize(int i,int st,int dr){
	if(st>=dr) A[i].size=A[i].left=A[i].right=A[i].ans=1;
	else{
		int mij=(st+dr)/2;
		getSize(2*i,st,mij);
		getSize(2*i+1,mij+1,dr);
		A[i].size=A[i].left=A[i].right=A[i].ans=A[2*i].size+A[2*i+1].size;
	}
}
void refresh(int i){
	if(A[i].upd){
		if(A[i].upd==1) A[i].ans=A[i].left=A[i].right=A[i].size;
		if(A[i].upd==2) A[i].ans=A[i].left=A[i].right=0;
		if(A[i].size>1) A[2*i].upd = A[2*i+1].upd = A[i].upd;
		A[i].upd=0;
	}
}
void comb_sol(aint &S,aint &A,aint &B){
	S.ans=max(A.ans,B.ans);
	S.ans=max(S.ans,A.right+B.left);
	S.left=A.left; if(A.left==A.size) S.left+=B.left;
	S.right=B.right; if(B.right==B.size) S.right+=A.right;
}
int type;
void Update(int i,int st,int dr,int a,int b){
	if(a<=st && dr<=b) A[i].upd=type;
	else{
		int mij=(st+dr)/2;
		if(b<=mij) refresh(2*i) , Update(2*i,st,mij,a,b);
		else if(a>mij) refresh(2*i+1) , Update(2*i+1,mij+1,dr,a,b);
		else refresh(2*i) , refresh(2*i+1) , Update(2*i,st,mij,a,mij) , Update(2*i+1,mij+1,dr,mij+1,b);
		refresh(2*i),refresh(2*i+1);
		comb_sol(A[i],A[2*i],A[2*i+1]);
	}
}
void flip(int x,int y,int t){ type=t+1 , Update(1,1,N,x,y); }
int query(){ refresh(1); return A[1].ans; }
int main(){
	in>>N>>P;
	getSize(1,1,N);
	int t,x,y;
	for(;P;--P){
		in>>t;
		if(t==1) in>>x>>y , y=x+y-1 , flip(x,y,1);
		if(t==2) in>>x>>y , y=x+y-1 , flip(x,y,0);
		if(t==3) out<<query()<<'\n';
	}
    return 0;
}