Cod sursa(job #2264059)

Utilizator alex2209alexPavel Alexandru alex2209alex Data 19 octombrie 2018 19:34:38
Problema Curcubeu Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <fstream>
#include <queue>
#include <iostream>
using namespace std;
ifstream f("curcubeu.in");
ofstream g("curcubeu.out");
queue<int>start[1000001],stop[1000001];
int v[3000001],nod,poz,n,a,b,c,i,cul[1000001],ap[1000001];
void elimina()
{
    v[1]=v[nod];
    poz=1;
    while(poz*2+1<nod)
    {
        if(v[poz*2]>v[poz*2+1] && v[poz*2]>v[poz])
        {
            swap(v[poz],v[poz*2]);
            poz*=2;
        }
        else if(v[poz*2+1]>v[poz])
        {
            swap(v[poz],v[poz*2+1]);
            poz*=2;
            poz++;
        }
        else break;
    }
    if(poz*2==nod-1 && v[poz]<v[poz*2])
    {
        swap(v[poz],v[poz*2]);
    }
}
void adauga(int val,int poz)
{
    v[poz]=val;
    while(poz/2>0 && v[poz]>v[poz/2])
    {
        swap(v[poz],v[poz/2]);
        poz/=2;
    }
}
int main()
{
    f>>n>>a>>b>>c;
    start[a].push(1);
    stop[b+1].push(1);
    cul[1]=c;
    v[1]=c;
    for(i=2;i<n;i++)
    {
        a=(a*i)%n;
        b=(b*i)%n;
        c=(c*i)%n;
        start[a].push(i);
        stop[b+1].push(i);
        cul[i]=c;
    }
    for(i=1;i<n;i++)
    {
        while(!start[i].empty())
        {
            a=start[i].front();
            nod++;
            adauga(a,nod);
            start[i].pop();
        }
        while(!stop[i].empty())
        {
            a=stop[i].front();
            ap[a]=1;
            stop[i].pop();
        }
        if(nod==0)
        {
            g<<0<<'\n';
            continue;
        }
        while(ap[v[1]]==1 && nod>=1)
        {
            elimina();
            nod--;
        }
        if(nod==0)
        {
            g<<0<<'\n';
            continue;
        }
        else
        {
            g<<cul[v[1]]<<'\n';
        }
    }
    return 0;
}