Cod sursa(job #2556989)

Utilizator Robys01Robert Sorete Robys01 Data 25 februarie 2020 13:41:39
Problema Hotel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.62 kb
#include <bits/stdc++.h>
#define x first
#define y second

using namespace std;

ifstream fin("hotel.in");
ofstream fout("hotel.out");

int n, m, baza, mod;
pair < int, int > tree[270000];

void update(int start, int stop, int c)
{
    start += baza - 1;
    stop +=start - 1;
    mod%=100001;
    for(int i = start; i <= stop; i++)
    {
        if(c == 1)
            tree[i].x = 1;
        if(c == 2)
            tree[i].x = 0;
    }


    for(int i = baza ; i<= baza * 2 - 1; i++)
    {
        if(tree[i].x != tree[i-1].x)
            mod++;
        tree[i].y = mod;

    }

    int poz = baza/2;

    for(int i = poz; i<=poz * 2 - 1; i++){
            if(tree[i*2].x == 0){
                tree[i].x=1;
                tree[i].y = tree[i*2].y;
            }
            if(tree[i*2+ 1].x == 0){
                tree[i].x=1;
                tree[i].y = tree[i*2 + 1].y;
            }
            if(tree[i*2].x == 0 && tree[i*2 + 1].x == tree[i*2].x){
                tree[i].x=2;
                tree[i].y = tree[i*2].y;
            }
            if(tree[i*2].x == tree[i*2 + 1].x and tree[i*2].x !=0)
                tree[i].x = 0;


    }
    for(int k = poz/2; k; k/=2)
    {
        for(int i = k; i<= k * 2 - 1; i++)
            if(tree[i * 2].y  != tree[i * 2 + 1].y){
                if(tree[i * 2].x > tree[i * 2 + 1].x){
                    tree[i].x = tree[i*2].x;
                    tree[i].y = tree[i*2].y;
                }else{
                    tree[i].x = tree[i*2 + 1].x;
                    tree[i].y = tree[i*2 + 1].y;

                }
            }else{
                tree[i].x = tree[i*2].x + tree[i*2 + 1].x;
                tree[i].y = tree[i*2].y;
            }
    }



}

int main()
{
    fin>>n>>m;

    baza = pow(2, (int)log2(n) + ( log2(n) > (int)log2(n) ? 1 : 0) ) + 0.5;


    for(int i = baza + n; i<=baza * 2 - 1; i++)
        tree[i].x = -1;

    int poz = baza / 2;

    for(int i = poz; i<=poz * 2 - 1; i++)
         tree[i].x = (tree[i*2].x == 0 ? 1 : 0 ) + (tree[i*2 + 1].x == 0 ? 1 : 0);

    for(int k = poz/2; k; k/=2)
    {
        for(int i=k; i<=k*2 - 1; i++)
           tree[i].x = tree[i*2].x + tree[i*2 + 1].x;
    }

    for(int c, a, b, i = 1; i<=m; i++)
    {
        fin>>c;
        if(c == 3)
            fout<<tree[1].x<<'\n';
        else
        {
            fin>>a>>b;
            update(a, b, c);

        }

    }


   /* for(int i = baza; i; i/=2){
        for(int k = i; k <= 2*i - 1; k++)
            fout<<tree[k].x<<'.'<<tree[k].y<<' ';
        fout<<'\n';
    }
*/

    return 0;
}