Cod sursa(job #1709350)

Utilizator linia_intaiConstantinescu Iordache Ciobanu Noi cei din linia intai linia_intai Data 28 mai 2016 11:54:14
Problema Pq Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.35 kb
#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;
}