Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- //#define int long long
- #define double long double
- #define Task "MAXLEN"
- #define READFILE freopen(Task".inp", "r", stdin)
- #define WRITEFILE freopen(Task".out", "w", stdout)
- #define double long double
- #define oo 0x3f3f3f3f3f
- #define FAST ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
- #define mp make_pair
- #define pb push_back
- #define X first
- #define Y second
- #define watch(x) cout << (#x) << " = " << x << endl
- #define debug(x) cout << (#x) << " = " << x << endl
- #define all(x) x.begin(), x.end()
- #define sz(x) x.size()
- #define endl '\n'
- #define max3(a,b,c) max(max(a, b), c)
- #define max4(a,b,c,d) max(max(a, b), max(c, d))
- #define min4(a,b,c,d) min(min(a, b), min(c, d))
- #define debug4(a,b,c,d) watch(a);watch(b);watch(c);watch(d)
- #define ever (;true;)
- #define maxn 505
- #define PI 3.14159265
- using namespace std;
- typedef pair < int, int > ii;
- typedef pair < int, ii > iii;
- typedef pair < ii, ii > iiii;
- typedef vector < int > vi;
- typedef vector < ii > vii;
- typedef vector < vi > vvi;
- typedef vector < iii > viii;
- typedef vector < vii > vvii;
- typedef vector < iiii > viiii;
- typedef vector < vvi > vvvi;
- const int N = 1e5 + 5;
- const int Blocksize = 316;
- int n, q;
- int a[N];
- int b[Blocksize + 5][N];
- int c[Blocksize + 5][N];
- struct Nho{
- int nho[N];
- int TimeUpdate[N];
- int Time = 0;
- Nho(){
- memset(TimeUpdate, 0, sizeof(TimeUpdate));
- Time = 1;
- }
- void set(int i, int val){
- TimeUpdate[i] = Time;
- nho[i] = val;
- }
- int Get(int i){
- if (TimeUpdate[i] != Time) return 0;
- return nho[i];
- }
- void reset(){
- ++Time;
- }
- }nho;
- void init(){
- FAST;
- #ifndef ONLINE_JUDGE
- READFILE;
- WRITEFILE;
- #endif // ONLINE_JUDGE
- scanf("%d%d", &n, &q);
- for (int i = 1; i <= n; ++i){
- scanf("%d", a + i);
- }
- vi val(a+1, a+1+n);
- sort(all(val));
- for (int i = 1; i <= n; ++i){
- a[i] = lower_bound(all(val), a[i]) - val.begin();
- }
- }
- void pp(){
- for (int k = 0; (k+1) * Blocksize <= n; ++k){
- nho.reset();
- for (int i = k*Blocksize + 1; i <= n; ++i){
- int j = nho.Get(a[i]);
- b[k][i] = b[k][i-1];
- if (j) b[k][i] = max(b[k][i], i - j);
- else nho.set(a[i], i);
- }
- }
- for (int k = 0; (k+1) * Blocksize <= n; ++k){
- nho.reset();
- for (int i = (k+1) * Blocksize; i >= 1; --i){
- int j = nho.Get(a[i]);
- c[k][i] = c[k][i+1];
- if (j) c[k][i] = max(c[k][i], j - i);
- else nho.set(a[i], i);
- }
- }
- }
- void Solve(){
- while (q--){
- int l, r;
- scanf("%d%d", &l, &r);
- int u = (l - 1) / Blocksize;
- int v = (r - 1) / Blocksize;
- if (v - u <= 1){
- nho.reset();
- int ans = 0;
- for (int i = l; i <= r; ++i){
- int j = nho.Get(a[i]);
- if (j) ans = max(ans, i - j);
- else nho.set(a[i], i);
- }
- cout << ans << endl;
- }
- else{
- int ans = max(b[u+1][r], c[v-1][l]);
- nho.reset();
- for (int i = l; i <= (u+1) * Blocksize; ++i){
- int j = nho.Get(a[i]);
- if (j) ans = max(ans, i - j);
- else nho.set(a[i], i);
- }
- for (int i = v*Blocksize + 1; i <= r; ++i){
- int j = nho.Get(a[i]);
- if (j) ans = max(ans, i - j);
- else nho.set(a[i], i);
- }
- cout << ans << endl;
- }
- }
- }
- signed main(){
- init();
- pp();
- Solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement