Pagini recente » Cod sursa (job #1925245) | Cod sursa (job #20531) | Cod sursa (job #486074) | Cod sursa (job #2248546) | Cod sursa (job #1538546)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
const int BMAX = 500;
const int NMAX = 400000;
char buffer[BMAX + 1];
int bpoz = BMAX - 1;
struct hotel{
int mx,l,r;
}v[NMAX];
int lazy[NMAX];
void parsare(int &x){
while(!isdigit(buffer[bpoz])){
bpoz++;
if(bpoz == BMAX){
bpoz = 0;
fin.read(buffer,BMAX);
}
}
x = 0;
while(isdigit(buffer[bpoz])){
x = x * 10 + (buffer[bpoz] - '0');
bpoz++;
if(bpoz == BMAX){
bpoz = 0;
fin.read(buffer,BMAX);
}
}
}
void buildtree(int nod,int l,int r){
if(l == r){
v[nod].mx = v[nod].l = v[nod].r = 1;
return;
}
int mij = (l+r) >> 1;
buildtree(nod * 2 + 1,mij + 1,r);
buildtree(nod * 2,l,mij);
int mx = max(v[2 * nod].mx,v[2 * nod + 1].mx);
if( v[2*nod].r + v[2*nod + 1].l > mx){
v[nod].mx = v[2*nod].r + v[2*nod + 1].l;
if(v[2*nod].l == v[2*nod].mx && v[2*nod].l == v[2*nod].r)
v[nod].l = v[nod].mx;
else
v[nod].l = v[2*nod].l;
if(v[2*nod + 1].r == v[2*nod + 1].mx && v[2*nod + 1].r == v[2*nod + 1].l)
v[nod].r = v[nod].mx;
else
v[nod].r = v[2*nod+1].r;
} else {
v[nod].mx = mx;
v[nod].l = v[2*nod].l;
v[nod].r = v[2*nod+1].r;
}
}
void update(int nod,int l,int r,int m,int M,int q){
if(lazy[nod]){
if(lazy[nod] == 1){
v[nod].mx = v[nod].l = v[nod].r = 0;
if(l != r)
lazy[2 * nod] = lazy[2 * nod + 1] = 1;
} else {
v[nod].mx = v[nod].l = v[nod].r = r - l + 1;
if(l != r)
lazy[2 * nod] = lazy[2 * nod + 1] = 2;
}
lazy[nod] = 0;
}
if(l > r || l > M || r < m) return;
if(l >= m && r <= M){
if(q == 1)
v[nod].mx = v[nod].l = v[nod].r = 0;
else
v[nod].mx = v[nod].l = v[nod].r = r - l + 1;
if(r != l){
lazy[2*nod] = q;
lazy[2*nod + 1] = q;
}
return ;
}
int mij = (l + r) >> 1;
update(2 * nod,l,mij,m,M,q);
update(2 * nod + 1,mij+1,r,m,M,q);
int mx = max(v[2 * nod].mx,v[2 * nod + 1].mx);
if( v[2*nod].r + v[2*nod + 1].l > mx){
v[nod].mx = v[2*nod].r + v[2*nod + 1].l;
if(v[2*nod].l == v[2*nod].mx && v[2*nod].l == v[2*nod].r)
v[nod].l = v[nod].mx;
else
v[nod].l = v[2*nod].l;
if(v[2*nod + 1].r == v[2*nod + 1].mx && v[2*nod + 1].r == v[2*nod + 1].l)
v[nod].r = v[nod].mx;
else
v[nod].r = v[2*nod+1].r;
} else {
v[nod].mx = mx;
v[nod].l = v[2*nod].l;
v[nod].r = v[2*nod+1].r;
}
}
int main()
{
int n,m,x,M,q;
parsare(n); parsare(m);
buildtree(1,1,n);
for(int i = 1; i <= m; i++){
parsare(q);
if(q == 3)
fout << v[1].mx << "\n";
else{
parsare(x); parsare(M);
if(q == 1)
update(1,1,n,x,x + M-1,1);
if(q == 2)
update(1,1,n,x, x + M-1,2);
}
}
return 0;
}