Pagini recente » Cod sursa (job #1798423) | Cod sursa (job #728374)
Cod sursa(job #728374)
#include<iostream>
#include<fstream>
using namespace std;
ifstream in("hotel.in");
ofstream out("hotel.out");
const int N = 100010;
int n,m,aint[3*N], pref[3*N], suf[3*N], x, y;
void init(int nod, int pozx, int pozy) {
aint[nod] = pref[nod] = suf[nod] = pozy - pozx + 1;
if(pozx==pozy)
return;
int mi = (pozx + pozy)>>1;
init(2*nod, pozx, mi);
init(2*nod + 1, mi+1, pozy);
}
void update1(int nod, int pozx, int pozy) {
if(pozx>=x && pozy<=y) {
aint[nod] = pref[nod] = suf[nod] = 0;
return;
}
int mi = (pozx + pozy)>>1;
if(mi>=x)
update1(2*nod, pozx, mi);
if(mi<y)
update1(2*nod+1, mi + 1, pozy);
pref[nod] = pref[2*nod];
if(pref[2*nod] == mi - pozx+1)
pref[nod] += pref[2*nod+1];
suf[nod] = suf[2*nod+1];
if(suf[2*nod+1] == pozy - mi)
suf[nod] += suf[2*nod];
aint[nod] = max(aint[2*nod], max(aint[2*nod+1], suf[2*nod] + pref[2*nod+1]));
}
void update2(int nod, int pozx, int pozy) {
if(pozx>=x && pozy<=y) {
aint[nod] = pref[nod] = suf[nod] = pozy - pozx + 1;
return;
}
int mi = (pozx + pozy)>>1;
if(aint[nod] == 0) {
aint[2*nod] = 0; pref[2*nod] = 0; suf[2*nod] = 0;
aint[2*nod+1] = 0; pref[2*nod+1] = 0; suf[2*nod + 1] = 0;
}
if(mi>=x)
update2(2*nod, pozx, mi);
if(mi<y)
update2(2*nod+1, mi+1, pozy);
pref[nod] = pref[2*nod];
if(pref[2*nod] == mi - pozx+1)
pref[nod] += pref[2*nod+1];
suf[nod] = suf[2*nod+1];
if(suf[2*nod+1] == pozy - mi)
suf[nod] += suf[2*nod];
aint[nod] = max(aint[2*nod], max(aint[2*nod+1], suf[2*nod] + pref[2*nod+1]));
if(aint[nod]>pozy-pozx+1)
aint[nod] = pozy - pozx + 1;
}
int main() {
int i,op;
in >> n >> m;
init(1,1,n);
for(i=1;i<=m;++i) {
in >> op;
if(op==1) {
in >> x >> y;
y+=x-1;
update1(1,1,n);
}
if(op==2) {
in >> x >> y;
y+=x-1;
update2(1,1,n);
}
if(op==3)
out << aint[1] << "\n";
}
return 0;
}