Pagini recente » Cod sursa (job #922111) | Cod sursa (job #1055951) | Cod sursa (job #892051) | Cod sursa (job #1423662) | Cod sursa (job #2098969)
#include <bits/stdc++.h>
#define NMAX 100005
#define PMAX 200005
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int N, P;
int aitMX[4 * NMAX], aitST[4 * NMAX], aitDR[4 * NMAX];
void build(int poz, int st, int dr)
{
aitMX[poz] = aitST[poz] = aitDR[poz] = dr - st + 1;
if (st == dr)
return;
int mij = st + (dr - st) / 2;
build(2 * poz, st, mij);
build(2 * poz + 1, mij + 1, dr);
}
void upd(int poz, int actLFT, int actRIT, int st, int dr, int tip)
{
int mij = st + (dr - st) / 2;
if (dr < actLFT || st > actRIT)
return;
if (st >= actLFT && actRIT >= dr)
{
aitMX[poz] = aitDR[poz] = aitST[poz] = tip * (dr - st + 1);
return;
}
if (aitMX[poz] == 0)
aitST[2 * poz] = aitDR[2 * poz] = aitMX[2 * poz] = aitST[2 * poz + 1] = aitDR[2 * poz + 1] = aitMX[2 * poz + 1] = 0;
if (aitMX[poz] == dr - st + 1)
{
aitST[2 * poz] = aitDR[2 * poz] = aitMX[2 * poz] = mij - st + 1;
aitST[2 * poz + 1] = aitDR[2 * poz + 1] = aitMX[2 * poz + 1] = dr - mij;
}
upd(2 * poz, actLFT, actRIT, st, mij, tip);
upd(2 * poz + 1, actLFT, actRIT, mij + 1, dr, tip);
aitST[poz] = aitST[2 * poz];
if (aitST[2 * poz] == mij - st + 1)
aitST[poz] += aitST[2 * poz + 1];
aitDR[poz] = aitDR[2 * poz + 1];
if (aitDR[2 * poz + 1] == dr - mij)
aitDR[poz] += aitDR[2 * poz];
aitMX[poz] = max(max(aitMX[2 * poz], aitMX[2 * poz + 1]), aitST[2 * poz + 1] + aitDR[2 * poz]);
}
int main()
{
fin >> N >> P;
build(1, 1, N);
for (int i = 1; i <= P; i++)
{
int q;
fin >> q;
if (q == 1)
{
int start, come;
fin >> start >> come;
upd(1, start, start + come - 1, 1, N, 0);
}
if (q == 2)
{
int start, leave;
fin >> start >> leave;
upd(1, start, start + leave - 1, 1, N, 1);
}
if (q == 3)
fout << aitMX[1] << "\n";
}
fin.close();
fout.close();
return 0;
}