这是一个诡异的帖子
楼主评测前后十几次,除了RE和MLE之外,WA全在39行,而且都报错太短
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+10;
int n,T,Log[N],st[N][20];
ll lastans;
struct node{
int id,num;
}a[N];
struct R{
ll sco;int x;
}res[N];
struct Ren{
int size,point;
}renge[N];
inline bool cmp(node a,node b)
{
return a.num<b.num;
}
inline int qwq(double a,double b)
{
if(fabs(a-b)<1e-8)return 0;
if(a>b)return 1;
return -1;
}
inline void RMQ()
{
Log[1]=0;
for(int i=2;i<=N;i++)Log[i]=Log[i>>1]+1;
for(int i=1;i<=n;i++)st[i][0]=i;
for(int j=1;j<=Log[n];j++)
{
for(int i=1;i+(1<<j)-1<=n;i++)
{
int tmp=qwq(1.0*res[st[i][j-1]].sco/res[st[i][j-1]].x,1.0*res[st[i+(1<<(j-1))][j-1]].sco/res[st[i+(1<<(j-1))][j-1]].x);
if(tmp==1)st[i][j]=st[i][j-1];
else if(tmp==0)
{
if(res[st[i][j-1]].x>res[st[i+(1<<(j-1))][j-1]].x)st[i][j]=st[i][j-1];
else st[i][j]=st[i+(1<<(j-1))][j-1];
}
else st[i][j]=st[i+(1<<(j-1))][j-1];
}
}
return;
}
inline R query(int x,int y)
{
int l=Log[y-x+1];
int tmp=qwq(1.0*res[st[x][l]].sco/res[st[x][l]].x,1.0*res[st[y-(1<<l)+1][l]].sco/res[st[y-(1<<l)+1][l]].x);
if(tmp==1)return res[st[x][l]];
if(tmp==0)
{
if(res[st[x][l]].x>res[st[y-(1<<l)+1][l]].x)return res[st[x][l]];
else return res[st[y-(1<<l)+1][l]];
}
else return res[st[y-(1<<l)+1][l]];
}
signed main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>T;
for(int i=1;i<=n;i++)res[i]={-1,1};
for(int i=1;i<=n;i++)
{
cin>>a[i].num;
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
ll sco=0,cnt=0;
for(int i=1;i<=n;i++)
{
int x=a[i].num,id=a[i].id;
renge[id]={1,id};
sco++;
cnt++;
if(renge[id-1].size!=0)
{
sco+=2ll*renge[id].size*renge[id-1].size;
cnt--;
int t=renge[id].size;
renge[id].size+=renge[id-1].size;
renge[id].point=renge[id-1].point;
renge[renge[id-1].point].size+=t;
renge[renge[id-1].point].point=id;
}
if(renge[id+1].size!=0)
{
sco+=2ll*renge[id].size*renge[id+1].size;
cnt--;
int t1=renge[renge[id+1].point].size,t2=renge[id+1].point;
renge[renge[id+1].point].size+=renge[id].size;
renge[renge[id+1].point].point=renge[id].point;
renge[renge[id].point].size+=t1;
renge[renge[id].point].point=t2;
}
if(i!=n&&a[i].num==a[i+1].num)continue;
if(qwq(1.0*res[cnt].sco/res[cnt].x,1.0*sco/x)<=0)res[cnt]={sco,x};
}
RMQ();
while(T--)
{
int a,b,x,y;
cin>>a>>b>>x>>y;
int l=((__int128)a*lastans+x-1)%n+1;
int r=((__int128)b*lastans+y-1)%n+1;
if(l>r)swap(l,r);
R tmp=query(l,r);
if(tmp.sco<0)
{
cout<<"-1 -1"<<endl;
cout<<l<<" "<<r<<" "<<lastans%n<<endl;
lastans=1;
continue;
}
cout<<tmp.sco<<" "<<tmp.x<<endl;
cout<<l<<" "<<r<<" "<<lastans%n<<endl;
lastans=tmp.sco*tmp.x;
}
return 0;
}