Pagini recente » Cod sursa (job #136106) | Cod sursa (job #775589) | Cod sursa (job #79659) | Cod sursa (job #753291) | Cod sursa (job #1709350)
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;
const int NMAX = 100005;
#define lsb(x) ((x) & (-(x)))
int aib[NMAX];
void init() {
memset(aib, -1, sizeof aib);
}
int n;
void update(int pos, int val) {
for (; pos <= n; pos += lsb(pos))
aib[pos] = max(aib[pos], val);
}
int query(int pos) {
int ans = -1;
for (; pos; pos -= lsb(pos))
ans = max(ans, aib[pos]);
return ans;
}
struct Query {
int dr;
int pos;
Query(int _dr = 0, int _pos = 0): dr(_dr), pos(_pos) {}
};
vector <Query> queries[NMAX];
int v[NMAX];
int _next[NMAX];
int anss[NMAX];
int main()
{
ifstream cin("pq.in");
ofstream cout("pq.out");
int q = 0;
cin >> n >> q;
init();
for (int i = 1; i <= n; ++ i)
cin >> v[i];
int st, dr;
for (int i = 1; i <= q; ++ i) {
cin >> st >> dr;
queries[st].push_back(Query(dr, i));
}
for (int i = n; i >= 1; -- i) {
//Update
if (_next[v[i]])
update(_next[v[i]], _next[v[i]] - i);
_next[v[i]] = i;
//Query
for (auto it: queries[i])
anss[it.pos] = query(it.dr);
}
for (int i = 1; i <= q; ++ i)
cout << anss[i] << '\n';
cin.close();
cout.close();
return 0;
}