Pagini recente » Cod sursa (job #1000411) | Cod sursa (job #922873) | Cod sursa (job #2526256) | Cod sursa (job #2366339) | Cod sursa (job #2805737)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("hotel.in");
ofstream fout ("hotel.out");
const int maxN = 4e5 + 5;
struct arbore {
int st, dr, val;
} arb[maxN];
bool marked[maxN];
bool tip[maxN];
void push(int v) {
if(marked[v]) {
arb[v*2].val = arb[v*2+1].val = arb[v].val;
marked[v*2] = marked[v*2+1] = true;
marked[v] = false;
}
}
void combine (int node) {
int fiu1 = node*2, fiu2 = node*2+1;
if(arb[fiu1].val == 0 && arb[fiu2].val == 0) {
arb[node].val = 0;
return ;
}
if(arb[fiu1].dr + 1 == arb[fiu2].st && arb[fiu1].val != 0 && arb[fiu2].val != 0) {
arb[node].st = arb[fiu1].st;
arb[node].dr = arb[fiu2].dr;
arb[node].val = arb[fiu1].val + arb[fiu2].val;
return ;
}
if(arb[fiu1].val < arb[fiu2].val) {
arb[node] = arb[fiu2];
return ;
}
if(arb[fiu1].val > arb[fiu2].val) {
arb[node] = arb[fiu1];
return ;
}
if(tip[node] == false)
arb[node] = arb[fiu2];
if(tip[node] == true)
arb[node] = arb[fiu2];
}
void build (int node, int st, int dr) {
if(st > dr) return ;
if(st == dr) {
arb[node].st = arb[node].dr = st;
arb[node].val = 1;
} else {
int mij = (st + dr) / 2;
build(node * 2, st, mij);
build(node * 2 + 1, mij+1, dr);
tip[node*2] = false;
tip[node*2+1] = true;
combine(node);
}
}
void update(int k, int st, int dr, int l, int r, int new_val) {
if(l > r) return;
if(l == st && dr == r) {
arb[k].val = new_val;
arb[k].st = st;
arb[k].dr = dr;
marked[k] = true;
} else {
push(k);
int mij = (st + dr) / 2;
update(k*2, st, mij, l, min(r, mij), new_val);
update(k*2+1, mij+1, dr, max(l, mij+1), r, new_val);
combine(k);
}
}
int main()
{
int n, p; fin >> n >> p;
build (1, 1, n);
for(int i = 1; i <= p; ++i) {
int op; fin >> op;
if(op == 1) {
int poz, m; fin >> poz >> m;
update(1, 1, n, poz, poz+m-1, 0);
} else if(op == 2) {
int poz, m; fin >> poz >> m;
update(1, 1, n, poz, poz+m-1, 1);
} else {
fout << arb[1].dr - arb[1].st + 1 << "\n";
}
}
return 0;
}