Cod sursa(job #2651040)

Utilizator ptudortudor P ptudor Data 21 septembrie 2020 15:04:50
Problema Curcubeu Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.39 kb
#include<bits/stdc++.h>
#define fore(start,i,end) for(int i = start; i <= end; i++)
#define dbg(x)  #x << "=" << x << " "
#define dbg2(x,y)  "{" << x << "," << y << "} "
#define dbg3(x,y,k) "{" << x << "," << y << "," << k << "} "
#define dbg4(x,y,k,j) "{" << x << "," << y << "," << k << " , " << j << "} "

#define ll long long
#define f1 first
#define f2 second
#define inf 1000000005
#define debug_st(st) if (true) {cout << #st << " : "; stack<int> s123; while (!s123.empty()) cout << s123.top() << " ", s123.pop(); cout << "\n";}
#define debug_a(a,n) cout << #a << " : "; for(int i = 1; i <= n; i++) cout << a[i] << " "; cout << "\n";
#define debug_m(a,n,m) cout << #a << " :\n"; for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++) cout << a[i][j] << " "; cout << "\n"; }cout << "\n";
#define debug_v(v) cout << #v << " : "; for(auto k : v) cout << k << " "; cout << "\n";
#define debug_s(s) cout << #s << " : "; for (auto k : s) cout << k < " "; cout << "\n";
#define debug_s2(s) cout << #s << " : "; for(auto k : s) cout << dbg2((*k).first,(*k).second); cout << "\n";
#define nmax 1000005



using namespace std;

ifstream in("curcubeu.in");
ofstream out("curcubeu.out");

int Height[nmax],root[nmax],dr[nmax],color[nmax],v[nmax],n;
struct querry
{
    int a,b,c;
}q[nmax];
int Find(int x)
{
    if (root[x] == 0) return x;
    root[x] = Find(root[x]);
    return root[x];
}
void join(int x, int y)
{
    if (x == y) return;
    x = Find(x);
    y = Find(y);
    if (x == y) return;

    ///unim y pe x, deci ne pasa ca size[y] sa fie minim.
    if (Height[y] > Height[x])
        swap(y , x);
    root[y] = x;
    Height[x] = max(Height[x] , Height[y] + 1);
    dr[x] = max(dr[x] , dr[y]);
}
void Update(int st, int dr2, int c)
{int i;
    ///merge prin toate valorile libere* de la st la dr. Cand da peste o valoare ocupata
    ///acceseaza marginea dreapta a chestiei si sari peste toate elementele, apoi da join la cele
    ///doua

    i = st;
    while (i <= dr2)
    {
        if (v[i] == 0)
        {
            color[i] = c;
            join(st , i);
            v[i] = 1;
            i++;
        }
        else if(v[i] == 1)
        {
            join(st , i);
            i = dr[Find(i)] + 1;
        }
    }
    if (v[st - 1] == 1) join(st - 1 , st);
    if (v[dr2 + 1] == 1) join(st , dr2+ 1);

   // cout << "Post update " << st << " " << dr2 << " " << c << "\n ";
   // for (i = 1; i <= n; i++)
 //   {
   //     cout << dbg(i) << "v = " << v[i] << " root = " << root[i] << " dr = " << dr[i] << " size = " << Height[i] << " color = " << color[i] << "\n";
  //  }cout << "\n\n";
}
int main()
{int i,st,dr2,c;
    in >> n >> q[1].a >> q[1].b >> q[1].c;
    for (i = 1; i <= n; i++) dr[i] = i,color[i] = 0, v[i] = 0,Height[i] = 0;
    n--;
    for (i = 2; i <= n; i++)
    {
        q[i].a = (q[i - 1].a * i) % (n + 1);
        q[i].b = (q[i - 1].b * i) % (n + 1);
        q[i].c = (q[i - 1].c * i) % (n + 1);
    }

  //  for (i = 1; i <= n; i++)
  //  {
   //    out << dbg3(q[i].a , q[i].b , q[i].c) << " ";
  //  }out << "\n";
    for (i = n; i >= 1; i--)
    {
        st = min(q[i].a , q[i].b);
        dr2 = max(q[i].a , q[i].b);
        c = q[i].c;

        cout << st << " " << dr2 << " " << c << "\n";
        Update(st , dr2 , c);
    }
    for (i = 1; i <= n; i++)
    {
        out << color[i] << "\n";
    }
}