Pagini recente » Cod sursa (job #2874978) | Cod sursa (job #2331562) | Cod sursa (job #3121227) | Cod sursa (job #727550) | Cod sursa (job #471201)
Cod sursa(job #471201)
#include <iostream>
using namespace std;
#define maxn 100010
int N, M, start, finish;
struct Arbint {
int cnt, st, dr;
} A[4*maxn];
void build(int nod, int left, int right) {
if(left == right) {
A[nod].st = A[nod].dr = A[nod].cnt = 1;
return;
}
A[nod].st = A[nod].dr = A[nod].cnt = right - left + 1;
int mij = (left + right) >> 1;
build(2*nod, left, mij);
build(2*nod + 1, mij + 1, right);
}
void update(int nod, int left, int right, int op) {
if(start <= left && right <= finish) {
if(op == 1) {
A[nod].st = A[nod].dr = A[nod].cnt = 0;
}
else if(op == 2) {
A[nod].st = A[nod].dr = A[nod].cnt = right - left + 1;
}
return;
}
if(left == right) return;
int mij = (left + right) >> 1;
if(A[nod].cnt == 0) {
A[2*nod].st = A[2*nod].dr = A[2*nod].cnt = 0;
A[2*nod + 1].st = A[2*nod + 1].dr = A[2*nod + 1].cnt = 0;
}
else if(A[nod].cnt == right - left + 1) {
A[2*nod].st = A[2*nod].dr = A[2*nod].cnt = mij - left + 1;
A[2*nod + 1].st = A[2*nod + 1].dr = A[2*nod + 1].cnt = right - mij;
}
if(finish < left || right < start) return;
if(start <= mij) update(2*nod, left, mij, op);
if(mij < finish) update(2*nod + 1, mij + 1, right, op);
//stinga
if(A[2*nod].st == mij - left + 1) {
A[nod].st = A[2*nod].st + A[2*nod + 1].st;
}
else {
A[nod].st = A[2*nod].st;
}
//dreapta
if(A[2*nod + 1].dr == right - mij) {
A[nod].dr = A[2*nod].dr + A[2*nod + 1].dr;
}
else {
A[nod].dr = A[2*nod + 1].dr;
}
//cnt
A[nod].cnt = max(A[2*nod].cnt, A[2*nod + 1].cnt);
A[nod].cnt = max(A[nod].cnt, A[2*nod].dr + A[2*nod + 1].st);
}
int main() {
FILE *f1=fopen("hotel.in", "r"), *f2=fopen("hotel.out", "w");
int i, op, p, q;
fscanf(f1, "%d %d\n", &N, &M);
build(1, 1, N);
while(M--) {
fscanf(f1, "%d", &op);
if(op == 1 || op == 2) {
fscanf(f1, "%d %d", &start, &finish);
finish = start + finish - 1;
update(1, 1, N, op);
}
else if(op == 3) {
fprintf(f2, "%d\n", A[1].cnt);
}
}
fclose(f1); fclose(f2);
return 0;
}