Pagini recente » Cod sursa (job #996188) | Cod sursa (job #2385472) | Cod sursa (job #2447987) | Cod sursa (job #169371) | Cod sursa (job #2264065)
#include <fstream>
#include <queue>
#include <iostream>
using namespace std;
ifstream f("curcubeu.in");
ofstream g("curcubeu.out");
queue<int>start[10001],stop[10001];
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;
if(a>b)
{
swap(a,b);
}
start[a].push(1);
stop[b+1].push(1);
cul[1]=c;
v[1]=c;
for(i=2; i<n; i++)
{
if(a>b)
{
swap(a,b);
}
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;
}