Pagini recente » Cod sursa (job #2028748) | Cod sursa (job #2266089) | Cod sursa (job #2629042) | Cod sursa (job #2045327) | Cod sursa (job #1640278)
#include<iostream>
#include<fstream>
#include<vector>
#include<iterator>
#include<bitset>
#include<algorithm>
#include<cmath>
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int V[100005], SQ[500], S[500], F[500], B[500], L[500];
int p, n, nrad;
int const oo = 1000000000;
void init()
{
int i;
nrad = sqrt(n);
for(i=0; i<nrad; i++){
S[i] = F[i] = B[i] = L[i] = nrad;
}
S[nrad] = F[nrad] = B[nrad] = L[nrad] = n - nrad*nrad;
}
void Update(int st, int dr, int val)
{
int i, radst, raddr, k;
radst = min((st-2)/nrad + 1, nrad + 1);
raddr = min(dr/nrad, nrad);
if(st == 1)
radst = 0;
for(i = radst; i < raddr; i++){
SQ[i] = val;
if(val == 1)
S[i] = F[i] = B[i] = 0;
if(val == 0)
S[i] = F[i] = B[i] = nrad;
}
if((st-1)%nrad || st > nrad*nrad){
if(SQ[radst - 1] >= 0)
for(i=(radst - 1)*nrad + 1; i <= (radst - 1)*nrad + L[radst - 1]; i++)
V[i] = SQ[radst - 1];
SQ[radst - 1] = -1;
for(i=st; i <= radst*nrad && i <= dr; i++)
V[i] = val;
S[radst-1] = 0;
for(i=(radst - 1)*nrad + 1; !V[i] && i <= (radst - 1)*nrad + L[radst - 1]; i++)
S[radst-1]++;
B[radst-1] = S[radst-1]; k = 0;
for( ; i <= (radst - 1)*nrad + L[radst - 1]; i++){
if(!V[i])
k++;
else
k = 0;
B[radst-1] = max(B[radst-1], k);
}
F[radst-1] = 0;
for(i=(radst - 1)*nrad + L[radst - 1]; i >= max(((radst - 1)*nrad + 1), 1) && !V[i]; i--)
F[radst-1]++;
}
if(dr%nrad || dr > nrad){
if(SQ[raddr] >= 0)
for(i=raddr*nrad + 1; i <= raddr*nrad + L[raddr]; i++)
V[i] = SQ[raddr];
SQ[raddr] = -1;
for(i=max(raddr*nrad + 1, st); i <= dr; i++)
V[i] = val;
S[raddr] = 0;
for(i=raddr*nrad + 1; !V[i] && i <= raddr*nrad + L[raddr]; i++)
S[raddr]++;
B[raddr] = S[raddr]; k = 0;
for( ; i <= raddr*nrad + L[raddr]; i++){
if(!V[i])
k++;
else
k = 0;
B[raddr] = max(B[raddr], k);
}
F[raddr] = 0;
for(i=raddr*nrad + L[raddr]; i >= (raddr*nrad + 1) && !V[i]; i--)
F[raddr]++;
}
}
void Query()
{
int i, maxi = -oo, tempf = 0;
for(i=0; i<=nrad; i++){
maxi = max(maxi, max(tempf + S[i], B[i]));
if(F[i] == L[i])
tempf += F[i];
else
tempf = F[i];
}
g<<maxi<<"\n";
}
int main()
{
int op, i, m;
f>>n>>p;
init();
while(p--){
f>>op;
if(op == 1){
f>>i>>m;
Update(i, i + m - 1, 1);
}
if(op == 2){
f>>i>>m;
Update(i, i + m - 1, 0);
}
if(op == 3)
Query();
}
}