rt主席树挂了
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+5;
struct node
{
int l,r,x;
}a[maxn<<6];
int n,b[maxn],t[maxn],rt[maxn],tot,lst[maxn],q;
int newnode(int rt)
{
++tot;
a[tot]=a[rt];
return tot;
}
int update(int l,int r,int rt,int x,int y)
{
rt=newnode(rt);
++a[rt].x;
if(l==r)
{
return rt;
}
int mid=l+r>>1;
if(x<=mid)
a[rt].l=update(l,mid,a[rt].l,x,y);
else
a[rt].r=update(mid+1,r,a[rt].r,x,y);
return rt;
}
int query(int l,int r,int lrt,int rrt,int x,int y)
{
// cerr<<l<<' '<<r<<' '<<a[rt].x<<' '<<rt<<endl;
if(l==r)
return a[rrt].x-a[lrt].x;
int s=0,mid=l+r>>1;
if(mid<x)
{
s+=a[a[rrt].l].x-a[a[lrt].l].x;
s+=query(mid+1,r,a[lrt].r,a[rrt].r,x,y);
return s;
}
return query(l,mid,a[lrt].l,a[rrt].l,x,y);
}
int nxt[maxn];
void subtask3init()
{
for(int i=1;i<=n;i++)
{
// cerr<<b[i]<<' ';
t[i]=b[i];
}
// cout<<endl;
sort(b+1,b+n+1);
int tn=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;i++)
t[i]=lower_bound(b+1,b+tn+1,t[i])-b;
for(int i=1;i<=n;i++)
{
rt[i]=update(0,n,rt[i-1],lst[t[i]],1);
lst[t[i]]=i;
}
}
int read()
{
char c=getchar();
int f=0,d=0;
while(!isdigit(c))
f|=c=='-',c=getchar();
while(isdigit(c))
d=d*10+(c^48),c=getchar();
return f?-d:d;
}
int Query(int a,int b,int c,int d,int e,int f)
{
// Do something...
// subtask3();
int s=0;
int l=a,r=b;
while(l<=r)
{
int mid=l+r>>1;
if(query(0,n,rt[mid-1],rt[d],mid,d)-query(0,n,rt[mid-1],rt[c],mid,c)+1>=e)
r=mid-1;
else
l=mid+1;
}
int tl=a,tr=b;
while(tl<=tr)
{
int mid=tl+tr>>1;
if(query(0,n,rt[mid-1],rt[d],mid,d)-query(0,n,rt[mid-1],rt[c],mid,c)+1<=f)
tl=mid+1;
else
tr=mid-1;
}
// for(int i=a;i<=b;i++)
// {
// int x=query(1,n,rt[d],i,d),y=query(1,n,rt[c],i,c);
// if(e<=x-y+1&&x-y+1<=f)
// ++s;
// }
return tr-l+1;
}
void Init()
{
// Do something...
cin>>n>>q;
for(int i=1;i<=n;i++)
// cin>>b[i];
b[i]=read();
subtask3init();
}
void print(int x)
{
if(x>=10)
print(x/10);
putchar(x%10+'0');
}
int main()
{
Init();
int lstans=0;
for(int i=1;i<=q;i++)
{
int a[5],e,f;
a[1]=read(),a[2]=read(),a[3]=read(),a[4]=read(),e=read(),f=read();
a[1]=(a[1]+lstans)%n+1;
a[2]=(a[2]+lstans)%n+1;
a[3]=(a[3]+lstans)%n+1;
a[4]=(a[4]+lstans)%n+1;
sort(a+1,a+5);
lstans=Query(a[1],a[2],a[3],a[4],e,f);
print(lstans);
puts("");
}
return 0;
}