Cod sursa(job #471201)

Utilizator vladiiIonescu Vlad vladii Data 17 iulie 2010 18:49:35
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#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;
}