蒲公英

暴力分块思想。分块的思想与莫队相同。它能将时间和空间复杂度均摊XD

belong表示所属区块,num维护区间颜色出现次数,maxx维护区间max值。查询时只需要比较两端的区块即可。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<utility>
#include<cstring>
#include<cctype>
using namespace std;
inline int read(){
int x=0,w=0;char c=getchar();
while(!isdigit(c))w|=c=='-',c=getchar();
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
return w?-x:x;
}
typedef pair<int,int> pii; namespace star
{
const int maxn=40010,block=1500,maxm=50;
int n,m,a[maxn],cnt,cn=1;
int belong[maxn],beg[maxm],end[maxm],num[maxm][maxm][maxn],maxx[maxm][maxm];
int ed[maxn],time=0;
int color[maxn],id[maxn];
int con[maxn];
pii p[maxn];
inline void solve(){
int l=0,r=0,ans=0;
while(m--){
time++;
l=(read()+ans-1)%n+1,r=(read()+ans-1)%n+1;
if(l>r)swap(l,r);
ans=0;
int mx=0,mxid=0;
if(belong[l]==belong[r]){
for(int i=l;i<=r;i++)
{
if(ed[id[i]]!=time)con[id[i]]=0,ed[id[i]]=time;
con[id[i]]++;
if(con[id[i]]>mx or (con[id[i]]==mx and id[i]<mxid))mxid=id[i],mx=con[mxid];
}
ans=color[mxid];
printf("%d\n",ans);
}else{
int L=belong[l]+1,R=belong[r]-1;
mxid=maxx[L][R];mx=num[L][R][mxid];
for(int i=l;i<beg[L];i++)
{
if(ed[id[i]]!=time)con[id[i]]=0,ed[id[i]]=time;
con[id[i]]++;
if(con[id[i]]+num[L][R][id[i]]>mx or (con[id[i]]+num[L][R][id[i]]==mx and id[i]<mxid))mxid=id[i],mx=con[mxid]+num[L][R][id[i]];
}
for(int i=end[R]+1;i<=r;i++)
{
if(ed[id[i]]!=time)con[id[i]]=0,ed[id[i]]=time;
con[id[i]]++;
if(con[id[i]]+num[L][R][id[i]]>mx or (con[id[i]]+num[L][R][id[i]]==mx and id[i]<mxid))mxid=id[i],mx=con[mxid]+num[L][R][id[i]];
}
ans=color[mxid];
printf("%d\n",ans);
}
}
} inline void makeblock(){
beg[1]=1;
cn=1;
for(int i=1;i<=n;i++){
if(!(i%block)){
end[cn]=i-1;
cn++;
beg[cn]=i;
}
belong[i]=cn;
}
if(n%block)cn++;
end[cn]=n;
for (int i = 1; i <= cn; i++)
for (int j = i; j <= cn; j++)
{
int makk = 0;
for (int k = beg[i]; k <= end[j]; k++)
num[i][j][id[k]]++;
for (int k = 1; k <= cnt; k++){
if(makk<num[i][j][k]) {
makk=num[i][j][k];
maxx[i][j]=k;
}
}
}
} inline void cried()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
p[i]=make_pair(read(),i);
sort(p+1,p+n+1);
for(int i=1;i<=n;i++){
if(p[i].first!=p[i-1].first or i==1)cnt++;
color[cnt]=p[i].first;
id[p[i].second]=cnt;
}
makeblock();
solve();
}
}
int main()
{
star::cried();
return 0;
}

最新文章

  1. Maven 配置远程仓库
  2. jq
  3. python实验二:字符串排序
  4. 拓扑排序 POJ 1049 Sorting It All Out
  5. 百度地图API示例之小实践 添加代理商标注
  6. java 验证身份证号
  7. asp.net的CascadingDropDown取值和赋值
  8. php代码生成二维码
  9. 解决gerber-Failed to Match All Shapes for PCB问题
  10. iOS-UIView指定圆角设置
  11. python内建数据类型有哪些
  12. Lodop打印如何隐藏table某一列
  13. WebApp开发技术搭配
  14. Springboot Thymeleaf 发邮件 将html内容展示在邮件内容中
  15. Python常用时间操作总结【取得当前时间、时间函数、应用等】转载
  16. OLE、OCX和ActiveX控件之间的比较
  17. 【Java】使用BigDecimal类进行精确小数计算
  18. Python安装模块出错(No module named setuptools)解决方法
  19. js里实现给数字加三位一逗号间隔的两种方法
  20. 10_MySQL DQL_子查询(嵌套的select)

热门文章

  1. Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer
  2. Centos flock 防止脚本重复运行
  3. TCP/IP协议 (图解+秒懂+史上最全)
  4. 手把手使用Python语音识别,进行语音转文字
  5. Reactive Spring实战 -- 响应式Kafka交互
  6. Vue(1)Vue安装与使用
  7. idea自动更新代码
  8. MySQL explain type 连接类型
  9. Vue(12)组件的组织结构和组件注册
  10. 39、wget、curl