Cod sursa(job #155439)

Utilizator cretuMusina Rares cretu Data 11 martie 2008 22:17:04
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <cstdio>
#define MAX 100000
#define maxi(a, b) ((a) > (b) ? (a) : (b))

using namespace std;

struct Node{
    int st, dr, c, val;
} x[50*MAX];

int sol, n, v;

int Maximum(int a, int b, int c, int d, int f)
{
    int aux = maxi(a, b);
    int aux2 = maxi(c, d);
    aux = maxi(aux, f);
    aux = maxi(aux, aux2);
    return aux;    
}

FILE * fout = fopen("hotel.out", "w");

void Update(int nod, int l, int r, int a, int b);

int main()
{
    int i, q, op, x1, x2, m;
    
    FILE * fin = fopen("hotel.in", "r");
    
    fscanf(fin, "%d %d", &n, &m);
    
    for (i = 1; i <= n; i++)
    {
        v = 1;
        Update(1, 1, n, i, i);
    }
    
    for (q = 1; q <= m; q++)
    {
         fscanf(fin, "%d ", &op);
         if (op != 3)   
         {
             fscanf(fin, "%d %d", &x1, &x2);
             
             if (op == 1) { v = 0; Update(1, 1, n, x1, x1+x2-1); }
             else         { v = 1; Update(1, 1, n, x1, x1+x2-1); }       
         }         
         else  fprintf(fout, "%d\n", x[1].val); 
    }
    
    fclose(fin);
    fclose(fout);
    
    return 0;
}

void Update(int nod, int l, int r, int a, int b)
{
     if (l == r)
     {  
         x[nod].st = x[nod].dr = x[nod].c = x[nod].val = v;
         return;      
     }     
     
     int mijl = (l+r)/2;
     
     if (a <= mijl) Update(2*nod, l, mijl, a, b);
     if (mijl < b)  Update(2*nod+1, mijl+1, r, a, b);
     
     int l1 = mijl-l+1, l2 = r-mijl;
     int ns = 2*nod, nd = 2*nod+1;
     
     if (x[ns].st == l1) x[nod].st = x[ns].st + x[nd].st;
     else                x[nod].st = x[ns].st;
     
     if (x[nd].dr == l2) x[nod].dr = x[nd].dr + x[ns].dr;
     else                x[nod].dr = x[nd].dr;
     
     x[nod].c = x[ns].dr + x[nd].st;
     
     x[nod].val = Maximum(x[nod].st, x[nod].dr, x[nod].c, x[ns].val, x[nd].val);
}