http://oj.acmclub.cn/problem.php?cid=1164&pid=4
#include <bits/stdc++.h>
#define N 200100
#define M 100000
using namespace std;
int num[N];
int idx;
int Max = -1;
int dp[N + 1][21];
void RMQ(int n);
int Log2(int n)
{
return log(n * 1.0) / log(2.0);
}
int main()
{
int n, q;
while(scanf("%d", &n) != EOF && n)
{
memset(num, 0, sizeof(num));
scanf("%d", &q);
Max = -1;
for(int i = 0; i < n; i++)
{
scanf("%d", &idx);
idx += M;
num[idx]++;
if(idx > Max)
Max = idx;
}
RMQ(Max);
while(q--)
{
int l, r;
scanf("%d%d", &l, &r);
l += M;
r += M;
int ch = Log2(l - r + 1);
printf("%d\n", max(dp[l][ch], dp[r - (1 << ch) + 1][ch]));
}
}
return 0;
}
void RMQ(int n)// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
{
for(int i = 0; i <= n; i++)
{
dp[i][0] = num[i];
}
for(int j = 1; j <= 18; j++)
{
for(int i = 1; i <= n; i++)
{
if(i + (1 << j) - 1 <= n)
dp[i][j] = max(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]);
else
break;
}
}
}
谨以此文纪念我失败的E题
最新推荐文章于 2024-06-12 21:06:14 发布