Pagini recente » Cod sursa (job #917093) | Cod sursa (job #397169) | Cod sursa (job #1715798) | Cod sursa (job #938224) | Cod sursa (job #1801195)
#include <cstdio>
#include <algorithm>
using namespace std;
struct nodaint
{
int pref, suf, ssmax, l;
}aint[400000];
int a, b, val;
void update(int nod, int left, int right)
{
if(left == right)
{
if(val == 0)
aint[nod].pref = aint[nod].suf = aint[nod].ssmax = aint[nod].l = 1;
else
{
aint[nod].pref = aint[nod].suf = aint[nod].ssmax = 0;
aint[nod].l = 1;
}
return;
}
int mid = (left + right) / 2;
if(a <= mid)
update(nod * 2, left, mid);
if(b > mid)
update(nod * 2 + 1, mid + 1, right);
if(aint[nod * 2].pref == aint[nod * 2].l)
aint[nod].pref = aint[nod * 2].l + aint[nod * 2 + 1].pref;
else
aint[nod].pref = aint[nod * 2].pref;
if(aint[nod * 2 + 1].suf == aint[nod * 2 + 1].l)
aint[nod].suf = aint[nod * 2 + 1].l + aint[nod * 2].suf;
else
aint[nod].suf = aint[nod * 2 + 1].suf;
aint[nod].ssmax = max(max(aint[nod * 2].ssmax, aint[nod * 2 + 1].ssmax),
aint[nod * 2].suf + aint[nod * 2 + 1].pref);
aint[nod].l = right - left + 1;
}
int main()
{
FILE *fin, *fout;
fin = fopen("hotel.in", "r");
fout = fopen("hotel.out", "w");
int n, p;
fscanf(fin, "%d%d\n", &n, &p);
a = 1;
b = n;
val = 0;
update(1, 1, n);
for(int i = 1; i <= p; i++)
{
char c;
fscanf(fin, "%c", &c);
if(c == '1')
{
fscanf(fin, "%d%d\n", &a, &b);
b = a + b - 1;
val = 1;
update(1, 1, n);
}
else if(c == '2')
{
fscanf(fin, "%d%d\n", &a, &b);
b = a + b - 1;
val = 0;
update(1, 1, n);
}
else
{
fprintf(fout, "%d\n", aint[1].ssmax);
fscanf(fin, "%c", &c);
}
}
return 0;
}