Pagini recente » Cod sursa (job #2746126) | Cod sursa (job #2611200) | Cod sursa (job #2462155) | Cod sursa (job #348138) | Cod sursa (job #992642)
Cod sursa(job #992642)
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 100003;
struct segment_tree {
int left, right, best;
short updated;
};
segment_tree AIB[NMAX * 3];
int _left, _right;
void AIB_build (const int &node, const int &left, const int &right) {
AIB[node].left = AIB[node].right = AIB[node].best = right - left + 1;
AIB[node].updated = 2;
if (left == right)
return;
const int &middle = left + right >> 1;
AIB_build (node * 2, left, middle);
AIB_build (node * 2 + 1, middle + 1, right);
}
void AIB_update (const int &node, const int &left, const int &right, const short &update) {
if (left >= _left && right <= _right) {
AIB[node].left = AIB[node].right = AIB[node].best = update ? right - left + 1 : 0;
AIB[node].updated = update;
return;
}
if (_right < left || _left > right)
return;
const int &middle = left + right >> 1;
if (AIB[node].updated != 2) {
AIB[node * 2].left = AIB[node * 2].right = AIB[node * 2].best = AIB[node].updated ? middle - left + 1 : 0;
AIB[node * 2 + 1].left = AIB[node * 2 + 1].right = AIB[node * 2 + 1].best = AIB[node].updated ? right - middle : 0;
AIB[node * 2].updated = AIB[node * 2 + 1].updated = AIB[node].updated;
AIB[node].updated = 2;
}
AIB_update (node * 2, left, middle, update);
AIB_update (node * 2 + 1, middle + 1, right, update);
AIB[node].best = max (max (AIB[node * 2].best, AIB[node * 2 + 1].best), AIB[node * 2].right + AIB[node * 2 + 1].left);
if (AIB[node * 2].left == middle - left + 1)
AIB[node].best = AIB[node].left = middle - left + 1 + AIB[node * 2 + 1].left;
else
AIB[node].left = AIB[node * 2].left;
if (AIB[node * 2 + 1].right == right - middle)
AIB[node].best = AIB[node].right = right - middle + AIB[node * 2].right;
else
AIB[node].right = AIB[node * 2 + 1].right;
}
int main () {
freopen ("hotel.in", "r", stdin);
freopen ("hotel.out", "w", stdout);
int N, P;
short t;
scanf ("%d%d", &N, &P);
AIB_build (1, 1, N);
while (P--) {
scanf ("%hd", &t);
if (t < 3) {
scanf ("%d%d", &_left, &_right);
_right += _left - 1;
AIB_update (1, 1, N, t - 1);
continue;
}
printf ("%d\n", AIB[1].best);
}
}