One Oier' s dawn

专题复习-RMQ 问题

与众不同

#include <cstdio>
//#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#define R(a,b,c) for(register int a = (b); (a) <= (c); ++(a))
#define nR(a,b,c) for(register int a = (b); (a) >= (c); --(a))
#define Fill(a,b) memset(a, b, sizeof(a))
#define Max(a,b) ((a) > (b) ? (a) : (b))
#define Min(a,b) ((a) < (b) ? (a) : (b))
#define Swap(a,b) ((a) ^= (b) ^= (a) ^= (b))

#define ON_DEBUGG

#ifdef ON_DEBUGG

#define D_e_Line printf("\n----------\n") 
#define D_e(x) cout << (#x) << " : " << x << endl
#define Pause() system("pause")
#define FileOpen() freopen("in.txt", "r", stdin)

#else

#define D_e_Line ;
#define D_e(x) ;
#define Pause() ;
#define FileOpen() ;

#endif
using namespace std;
struct ios{
    template<typename ATP>inline ios& operator >> (ATP &x){
        x = 0; int f = 1; char ch;
        for(ch = getchar(); ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;
        while(ch >= '0' && ch <= '9') x = x * 10 + (ch ^ '0'), ch = getchar();
        x *= f;
        return *this;
    }
}io;

template<typename ATP>inline ATP max(ATP &a, ATP &b){
    return a > b ? a : b;
}
template<typename ATP>inline ATP min(ATP &a, ATP &b){
    return a < b ? a : b;
}


const int N = 200007;

int n;
namespace RMQ{

int f[N][21], lg[N], bin[21], last[N * 10], a[N], pos[N];
inline void Prepare(){
    bin[0] = 1;
    R(i,1,20) bin[i] = bin[i - 1] << 1;
    R(i,2,n) lg[i] = lg[i >> 1] + 1;
}
inline void Init(){
    R(i,1,n){
        io >> a[i];
        a[i] += 1000000;
        pos[i] = max(pos[i - 1], last[a[i]] + 1);
        f[i][0] = i - pos[i] + 1;
        last[a[i]] = i;
    }
    
    int t = lg[n];
    R(j,1,t){
        int maxx = n - bin[j] + 1;
        R(i,1,maxx){
            f[i][j] = max(f[i][j - 1], f[i + bin[j - 1]][j - 1]);
        }
    }
}
inline int Query(int l, int r){
    int t = lg[r - l + 1];
    return max(f[l][t], f[r - bin[t] + 1][t]);
}

}

int main(){
//FileOpen();
//freopen("1.txt", "w", stdout);

    int m;
    io >> n >> m;
    RMQ::Prepare();
    RMQ::Init();
    while(m--){
        int L, R;
        io >> L >> R;
        ++L, ++R;
//      int l = L, r = R, P;
//      while(l <= r){
//          int mid = (l + r) >> 1;
//          if(RMQ::pos[mid] <= L){
//              l = mid + 1;
//              P = l;
//          }
//          else
//              r = mid - 1;
//      }
        int P = lower_bound(RMQ::pos + L, RMQ::pos + R + 1, L) - RMQ::pos;
        printf("%d\n", min(R - L + 1, max(P - L, RMQ::Query(P, R)))); // false : P - L + 1
    }
    
    return 0;
}
上一篇:Python3 多线程编程 threading模块


下一篇:rac迁移或恢复到单实例