Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 1e5+5;
- const int ssize=316;
- int n, m;
- int a[N];
- int b[ssize+5][N];
- int c[ssize+5][N];
- int MAX(int x, int y){
- if (x>y) return x;
- return y;
- }
- struct NHO{
- int nho[N];
- long long tim[N];
- long long T=0;
- NHO(){
- memset(tim, 0, sizeof tim);
- T=1;
- }
- void reset(){T++;}
- int get(int x){
- if (tim[x]!=T) return 0;
- return nho[x];
- }
- void Set(int x, int val){
- tim[x] = T;
- nho[x] = val;
- }
- };
- NHO nho;
- int main()
- {
- if (fopen("test.inp","r")) freopen("test.inp","r",stdin);
- ios_base::sync_with_stdio(false);
- cin.tie(0);cout.tie(0);
- cin >> n >> m;
- for(int i=1; i<=n; i++) cin >> a[i];
- vector<int> bb(a+1,a+1+n);
- sort(bb.begin(),bb.end());
- for(int i=1; i<=n; i++) a[i] = lower_bound(bb.begin(),bb.end(),a[i])-bb.begin();
- for(int k=0; (k+1)*ssize<=n; k++){
- nho.reset();
- int u = k*ssize + 1;
- for(int i=u; i<=n; i++){
- int j = nho.get(a[i]);
- if (j) b[k][i] = MAX(b[k][i-1],i-j);
- else nho.Set(a[i],i), b[k][i] = b[k][i-1];
- }
- }
- for(int k=0; k<=ssize; k++){
- nho.reset();
- int u = min(n,(k+1)*ssize);
- for(int i=u; i>=1; i--){
- int j = nho.get(a[i]);
- if (j) c[k][i] = MAX(c[k][i+1],j-i);
- else nho.Set(a[i],i), c[k][i] = c[k][i+1];
- }
- }
- while (m--){
- int l, r;
- cin >> l >> r;
- int u = (l-1)/ssize;
- int v = (r-1)/ssize;
- int res=0;
- if (v-u<=1){
- nho.reset();
- for(int i=l; i<=r; i++){
- int j = nho.get(a[i]);
- if (j) res = MAX(res,i-j);
- else nho.Set(a[i],i);
- }
- cout << res << '\n';
- }
- else{
- res = MAX(b[u+1][r],c[v-1][l]);
- nho.reset();
- for(int i=l; i<=(u+1)*ssize; i++){
- int j = nho.get(a[i]);
- if (j) res = MAX(res,i-j);
- else nho.Set(a[i],i);
- }
- for(int i=v*ssize+1; i<=r; i++){
- int j = nho.get(a[i]);
- if (j) res = MAX(res,i-j);
- else nho.Set(a[i],i);
- }
- cout << res << '\n';
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement