全 WA 求调
查看原帖
全 WA 求调
1359837
Dream_Stars楼主2025/1/3 23:30
# include <bits/stdc++.h>


# define inf 1e15

using namespace std;

inline int read (){int s = 0 ; bool w = 0 ; char c = getchar () ; while (!isdigit (c)) {w |= (c == '-') ,c = getchar () ;} while (isdigit (c)){s = (s << 1) + (s << 3) + (c ^ 48) ; c = getchar ();}return w ? -s : s;}
inline void write (int x){if (x < 0) putchar ('-') ,x = -x; if (x > 9) write (x / 10) ; putchar (x % 10 | 48);}
inline void writesp (int x){write (x) ,putchar (' ');}
inline void writeln (int x){write (x) ,putchar ('\n');}

const int N = 6e5 + 15 ,BLOCK = sqrt (N) + 100;

int n ,Q ,num ,len ,V ,discrete[N] ,a[N] ,sum[N] ,pos[N];

vector <int> vec[N];

int pre;

int l[BLOCK], r[BLOCK] ,z[BLOCK][BLOCK] ,belong[N];

inline void build (){
  for (int i = 1 ; i <= num; i ++)
    l[i] = (i - 1) * len + 1, r[i] = i * len;

  r[num] = n;

  for (int i = 1 ; i <= n ; i ++) belong[i] = (i - 1) / len + 1;

  for (int i = 1 ; i <= num ; i ++){
    memset (sum ,0 , sizeof sum);
    for (int j = i ; j <= num ; j ++){
      z[i][j] = z[i][j - 1];
      for (int k = l[j] ; k <= r[j] ; k ++){

        sum[a[k]] ++;

        z[i][j] = max (z[i][j] ,sum[a[k]]);
      }
      
    } memset (sum ,0 , sizeof sum);
    //for (int j = i ; j <= num ; j ++) for (int k = l[j] ; k <= r[j] ; k ++) sum[a[k]] = 0;
  }

} signed main (){

  n = read () ,Q = read () ,len = sqrt (n);

  num = 707;

  for (int i = 1 ; i <= n ;i ++) a[i] = read () ,discrete[i] = a[i];

 // sort (discrete + 1, discrete + 1 + n);

  //V = unique (discrete + 1 ,discrete + 1 + n) - (discrete) ;

  //for (int i = 1 ; i <= n ; i ++) a[i] = lower_bound (discrete + 1 ,discrete + V ,a[i]) - discrete;
  
  for (int i = 1 ; i <= n ; i ++) {
    vec[a[i]].push_back (i);

    pos[i] = vec[a[i]].size () - 1;

  }
  
  build ();

  while (Q --){
    int ls = read () ,rs = read ();
    
    ls ^= pre ,rs ^= pre;
    
    if (ls > rs) swap (ls ,rs);

    int L = belong[ls] ,R = belong[rs];

    if (L + 2 >= R){
      int ans = 0;

      for (int i = ls ; i <= rs ; i ++) sum[a[i]] ++;

      for (int i = ls ; i <= rs ; i ++)
        ans = max (ans ,sum[a[i]]);

      for (int i = ls ; i <= rs ; i ++) sum[a[i]] = 0;

      writeln (ans);

      //writeln (discrete[res]);

      pre = ans;
    } else {

        int ans = z[L + 1][R - 1];
//cout << L << ' ' << R << ' ' << ans << endl;
        for (int i = ls ; i <= r[L]; i ++){

          int now = pos[i] ,sz = vec[a[i]].size ();

          while (now + ans < sz && vec[a[i]][now + ans] <= rs) ++ ans;

        }

        for (int i = l[R] ; i <= rs; i ++){
          
          int now = pos[i];

          while (now - ans >= 0 && vec[a[i]][now - ans] >= ls) ++ ans;

        }

        writeln (ans);

        pre = ans;
    }
  }
  return 0;

}
2025/1/3 23:30
加载中...