Cod sursa(job #1909960)

Utilizator UMihneaUngureanu Mihnea UMihnea Data 7 martie 2017 14:52:59
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;

int n, q, aint[400000], last[100000], M, i, L, R, Z, x, query(int, int, int), st[100010], ans[100010];
vector<pair<int, int> > Q[100010];

int main()
{
    freopen("pq.in", "r", stdin);
    freopen("pq.out", "w", stdout);
    cin >> n >> q;
    for(M = 1; M < n; M *= 2);
    Z = M-1;
    for(i = 1; i <= n; i++)
    {
        cin >> x;
        st[i] = i;
        if(last[x]) st[i] = last[x];
        last[x] = i;
    }
    for(i = 1; i <= q; i++)
    {
        cin >> L >> R;
        Q[R].push_back({L, i});
    }
    for(R = 1; R <= n; R++)
    {
        int poz = Z + st[R];
        int val = R - st[R];
        aint[poz] = val;
        for(poz /= 2; poz; poz /= 2)
            aint[poz] = max(aint[2*poz], aint[2*poz+1]);
        for(auto it : Q[R])
        {
            L = it.first;
            ans[it.second] = query(1, M, 1);
        }
    }
    for(i = 1; i <= q; i++)
        cout << (ans[i] ? ans[i] : -1) << '\n';
    return 0;
}
int query(int st, int dr, int nod)
{
    int mi = (st+dr)/2;
    if(st > R || L > dr)
        return 0;
    if(L <= st && dr <= R)
        return aint[nod];
    return max(query(st, mi, 2*nod), query(mi+1, dr, 2*nod+1));
}