sb再次球调莫队/kel
查看原帖
sb再次球调莫队/kel
253765
houpingze楼主2021/4/12 22:33

rt,已经调傻了dk

#include<bits/stdc++.h>
#define reg register int
#define INF (1<<30) 
//#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 
#define y(x) id[x]
#define f(x) x/S
//#define int long long
#pragma GCC optimize("Ofast")
using namespace std;

const int inf=1e9;
char buf[1<<23],*p1=buf,*p2=buf,obuf[1<<23],*O=obuf;
int read(){
    int res=0,fs=1; char c=getchar();
    while(!(c>='0' && c<='9')){ if(c=='-')fs=-1; c=getchar(); }
    while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();
    return res*fs;
}
void print(int x){
    if(x<0) { putchar('-'); x=-x;}
    if(x>9) print(x/10);
    putchar(x%10+'0');
}
int n,cnt,m,a[2000005],ans,k,tmp,aw[2000005],id[2000005];
struct Q{
    int l,r,idx,ans;
}q[2000005];  
int S;
bool cmp(Q x,Q y){ 
    return ((y(x.l)^y(y.l))?x.l<y.l:((y(x.l)&1)?x.r<y.r:x.r>y.r));
}
int idx[2000005];
//map<int,int>cnt1,cnt2;
int cnt1[2000005];//x的出现次数
int cnt2[2000005];//有几个数出现了x次
void add(int x){//cnt2->tmp cnt1->cnt
	cnt2[cnt1[a[x]]]--;
	cnt1[a[x]]++;
	cnt2[cnt1[a[x]]]++;
	ans=max(ans,cnt1[a[x]]);
}
void del(int x){//tmp cnt2
	
	cnt2[cnt1[a[x]]]--; 
	if(cnt2[cnt1[a[x]]]==0&&cnt1[a[x]]==ans) ans--;
	cnt1[a[x]]--;
	cnt2[cnt1[a[x]]]++;
}
signed main() { 
//  cin>>n;
	while(1){ 
	
	    memset(cnt1,0,sizeof(cnt1));
	    memset(cnt2,0,sizeof(cnt2));
		n=read();
		if(n==0) break;
	    S=2135;
	    m=read(); 
	    for(reg i=1;i<=n;i++) id[i]=f(i);
	    for(reg i=1;i<=n;i++) a[i]=read(),a[i]+=100000;
	//  cin>>m; 
		
	    for(reg i=1;i<=m;i++) {
	        int t1,t2;
	        t1=read(),t2=read();
	        q[i]={t1,t2,i,0};
	    }
	    sort(q+1,q+m+1,cmp);
	    reg l=1,r=0;
	    for(reg i=1;i<=m;i++){
	        int st=q[i].l,ed=q[i].r; 
	        while(l<st) { 
	        	del(l);
	            ++l;
	        }
	        while(l>st) { 
	       		l--;
	       		add(l); 
	        }
	        while(r<ed) {
	        	r++; 
				add(r); 
			}
	        while(r>ed) { 
	            del(r);
	            --r; 
	        }
	        aw[q[i].idx]=ans;
	    } 
	    for(reg i=1;i<=m;++i){
			cout<<aw[i]<<'\n';
			aw[i]=0;
	    }	
	    ans=0;
	    memset(cnt1,0,sizeof(cnt1));
	    memset(cnt2,0,sizeof(cnt2)); 
	} 
    return 0;
}
2021/4/12 22:33
加载中...