Submission #493757

#TimeUsernameProblemLanguageResultExecution timeMemory
493757CristianRestore Array (RMI19_restore)C++14
45 / 100
53 ms644 KiB
#include <iostream>

using namespace std;
const int NMAX = 10005;
int v[NMAX], sp[NMAX], l[NMAX], r[NMAX], k[NMAX], value[NMAX], SP1[NMAX], SP0[NMAX], set1[NMAX], set0[NMAX], SP[NMAX];
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int n, m, i, ns, b, subtask, ok, j;
    cin >> n >> m;
    subtask = 3;
    for(i = 1; i <= m; i++)
    {
        cin >> l[i] >> r[i] >> k[i] >> value[i];
        l[i]++;
        r[i]++;
        if(k[i] != 1)
            subtask = 3;
    }
    /// Subtask #1
    if(n <= 18 && m <= 200)
    {
        ns = (1 << n);
        for(b = 0; b < ns; b++)
        {
            sp[0] = 0;
            for(i = 1; i <= n; i++)
            {
                sp[i] = sp[i - 1];
                if((1 << (i-1)) & b)
                    sp[i]++;
            }
            ok = 1;
            for(i = 1; i <= m; i++)
            {
                if(value[i] == 0 && sp[r[i]] - sp[l[i] - 1] > r[i] - l[i] - k[i] + 1)
                {
                    ok = 0;
                    break;
                }
                if(value[i] == 1 && sp[r[i]] - sp[l[i] - 1] < r[i] - l[i] - k[i] + 2)
                {
                    ok = 0;
                    break;
                }
            }
            if(ok)
            {
                for(i = 1; i <= n; i++)
                {
                    cout << sp[i] - sp[i-1] << ' ';
                }
                return 0;
            }
        }
        cout << "-1";
        return 0;
    }
    /// Subtask #2
    if(subtask == 2)
    {
        for(i = 1; i <= m; i++)
        {
            if(value[i] == 1)
            {
                SP[r[i] + 1]--;
                SP[l[i]]++;
            }
        }
        for(i = 1; i <= n; i++)
        {
            SP[i] += SP[i-1];
            if(SP[i])
                v[i] = 1;
            else
                v[i] = 0;
            sp[i] = sp[i-1] + v[i];
        }
        ok = 1;
        for(i = 1; i <= m; i++)
        {
            if(value[i] == 0 && sp[r[i]] - sp[l[i] - 1] > r[i] - l[i] - k[i] + 1)
            {
                ok = 0;
                break;
            }
            if(value[i] == 1 && sp[r[i]] - sp[l[i] - 1] < r[i] - l[i] - k[i] + 2)
            {
                ok = 0;
                break;
            }
        }

        if(!ok)
        {
            cout << "-1";
            return 0;
        }
        for(i = 1; i <= n; i++)
            cout << v[i] << ' ';
        return 0;
    }
    if(subtask == 3)
    {
        for(i = 1; i <= n; i++)
            v[i] = 2;
        for(i = 1; i <= m; i++)
        {
            if(k[i] == 1 && value[i] == 1)
            {
                for(j = l[i]; j <= r[i]; j++)
                    v[j] = 1;
            }
            if(k[i] == r[i] - l[i] + 1 && value[i] == 0)
            {
                for(j = l[i]; j <= r[i]; j++)
                {
                    if(v[j] == 1)
                    {
                        cout << "-1";
                        return 0;
                    }
                    v[j] = 0;
                }
            }
        }
        for(i = 1; i <= m; i++)
        {
            if(k[i] == 1 && value[i] == 0)
            {
                ok = 0;
                for(j = l[i]; j <= r[i]; j++)
                {
                    if(v[j] == 0)
                        ok = 1;
                    if(v[j] == 2 && !ok)
                    {
                        v[j] = 0;
                        ok = 1;
                    }
                }
                if(!ok)
                {
                    cout << "-1";
                    return 0;
                }
            }
            if(k[i] == r[i] - l[i] + 1 && value[i] == 1)
            {
                ok = 0;
                for(j = l[i]; j <= r[i]; j++)
                {
                    if(v[j] == 1)
                        ok = 1;
                    if(v[j] == 2 && !ok)
                    {
                        v[j] = 1;
                        ok = 1;
                    }
                }
                if(!ok)
                {
                    cout << "-1";
                    return 0;
                }
            }
        }
        for(i = 1; i <= n; i++)
        {
            if(v[i] == 2)
                cout << "0 ";
            else
                cout << v[i] << ' ';
        }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...