Pagini recente » Cod sursa (job #795304) | Cod sursa (job #2244383) | Cod sursa (job #1673813) | Cod sursa (job #9217) | Cod sursa (job #3233509)
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cmath>
#define NMAX 100005
#define NLOGMAX 18
using namespace std;
const string nume_fisier = "hotel";
ifstream fin(nume_fisier + ".in");
ofstream fout(nume_fisier + ".out");
int pos, val, start, finish;
int n, m;
struct node {
int maxi, maxdr, maxst;
bool elafel;
};
vector<node> arb;
void update(int nod, int left, int right)
{
if (start <= left && finish>= right)
{
if (val == 0) {
arb[nod] = node{ 0,0,0,true };
}
else {
arb[nod] = node{ right - left + 1, right - left + 1, right - left + 1,true };
}
return;
}
int m = left + right;
m /= 2;
if (arb[nod].elafel) {
if (arb[nod].maxi == 0) {
arb[2 * nod] = node{ 0,0,0,true };
arb[2 * nod + 1] = node{ 0,0,0,true };
}
else {
arb[2 * nod] = node{ m - left + 1,m - left + 1,m - left + 1,true };
arb[2 * nod + 1] = node{ right - m,right - m,right - m,true };
}
arb[nod].elafel = false;
}
if (start <= m)
update(2 * nod, left, m);
if(m< finish)
update(2 * nod + 1, m + 1, right);
//maxi
if (arb[2 * nod].maxdr + arb[2 * nod + 1].maxst > max(arb[2 * nod].maxi, arb[2 * nod + 1].maxi))
{
arb[nod].maxi = arb[2 * nod].maxdr + arb[2 * nod + 1].maxst;
}
else {
arb[nod].maxi = max(arb[2 * nod].maxi, arb[2 * nod + 1].maxi);
}
//maxi stanga
if (arb[2 * nod].maxst == m-left+1)
{
arb[nod].maxst = m-left+1 + arb[2 * nod + 1].maxst;
}
else {
arb[nod].maxst = arb[2 * nod].maxst;
}
//maxi dreapta
if (arb[2 * nod + 1].maxdr == right-m)
{
arb[nod].maxdr = right-m + arb[2 * nod].maxdr;
}
else {
arb[nod].maxdr = arb[2 * nod + 1].maxdr;
}
}
void afisare()
{
for (int i = 0; i < arb.size(); ++i)
{
cout << arb[i].maxi << " " << arb[i].maxst << " " << arb[i].maxdr << '\n';
}
cout << '\n';
}
int main()
{
fin >> n >> m;
int arbsize = 1;
while (arbsize < n) {
arbsize *= 2;
}
arb.resize(2 * arbsize);
arb[1] = node{ n,n,n,true };
arb[1] = node{ n,n,n,true };
for (int i = 0; i < m; ++i)
{
int c;
fin >> c;
if (c == 1)
{
fin >> start >> finish;
finish += start - 1;
val = 0;
update(1, 1, n);
//afisare();
}
else if (c == 2)
{
fin >> start >> finish;
val = 1;
finish += start - 1;
update(1, 1, n);
//afisare();
}
else
fout << arb[1].maxi << '\n';
}
}