Pagini recente » Cod sursa (job #1823813) | Cod sursa (job #2585777) | Cod sursa (job #1396659) | Cod sursa (job #2577411) | Cod sursa (job #2871702)
#include <bits/stdc++.h>
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int n,m,p;
int i;
int a,b;
int op;
struct SegmentTree{
int sufix,prefix,maxseq;
}arbint[400005];
void check_in(int pos, int st, int dr) {
if (a<=st && dr<=b) {
arbint[pos].sufix = arbint[pos].prefix = arbint[pos].maxseq = 0;
}
if (st!=dr && dr>=a && b>=st) {
int mij = (st+dr)/2;
check_in(2*pos,st,mij);
check_in(2*pos+1,mij+1,dr);
arbint[pos].maxseq = max(max(arbint[2*pos].maxseq,arbint[2*pos+1].maxseq),arbint[2*pos].sufix+arbint[2*pos+1].prefix);
arbint[pos].prefix = arbint[2*pos].prefix;
arbint[pos].sufix = arbint[2*pos+1].sufix;
if (arbint[2*pos].maxseq==(mij-st+1)) arbint[pos].prefix = arbint[2*pos].maxseq+arbint[2*pos+1].prefix;
if (arbint[2*pos+1].maxseq==(dr-mij)) arbint[pos].sufix = arbint[2*pos+1].maxseq+arbint[2*pos].sufix;
}
}
void check_out(int pos, int st, int dr) {
if (a<=st && dr<=b) {
arbint[pos].sufix = arbint[pos].prefix = arbint[pos].maxseq = dr-st+1;
}
if (st!=dr && dr>=a && b>=st) {
int mij = (st+dr)/2;
check_out(2*pos,st,mij);
check_out(2*pos+1,mij+1,dr);
arbint[pos].maxseq = max(max(arbint[2*pos].maxseq,arbint[2*pos+1].maxseq),arbint[2*pos].sufix+arbint[2*pos+1].prefix);
arbint[pos].prefix = arbint[2*pos].prefix;
arbint[pos].sufix = arbint[2*pos+1].sufix;
if (arbint[2*pos].maxseq==(mij-st+1)) arbint[pos].prefix = arbint[2*pos].maxseq+arbint[2*pos+1].prefix;
if (arbint[2*pos+1].maxseq==(dr-mij)) arbint[pos].sufix = arbint[2*pos+1].maxseq+arbint[2*pos].sufix;
}
}
int main()
{
f >> n >> p;
a=1; b=n;
check_out(1,1,n);
for (int w=1;w<=p;w++) {
f >> op;
if (op==1) {
f >> i >> m;
a = i; b = m+i-1;
check_in(1,1,n);
}
else if (op==2) {
f >> i >> m;
a = i; b = m+i-1;
check_out(1,1,n);
}
else {
g << arbint[1].maxseq << '\n';
}
}
return 0;
}