Cod sursa(job #2196739)

Utilizator giotoPopescu Ioan gioto Data 20 aprilie 2018 11:16:19
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 2.11 kb
#include <bits/stdc++.h>
using namespace std;

int n, q;
int a[100005];
int f[100005];
struct query{
    int l, r, p;
    bool operator < (const query &aux)const{
        return r < aux.r;
    }
};
struct usu{
    int urm, p;
    bool operator < (const usu &aux)const{
        return urm < aux.urm;
    }
};
query Q[100005];
usu b[100005];
int ans[100005];
int Arb[400005];
inline void Build(int st, int dr, int nod){
    if(st == dr){
        Arb[nod] = b[st].urm - b[st].p;
        return ;
    }
    int mij = (st + dr) / 2;
    Build(st, mij, nod * 2);
    Build(mij + 1, dr, nod * 2 + 1);
    Arb[nod] = max(Arb[nod * 2], Arb[nod * 2 + 1]);
}
inline void Update(int st, int dr, int nod, int pos){
    if(st == dr){
        Arb[nod] = 0;
        return ;
    }
    int mij = (st + dr) / 2;
    if(pos <= mij) Update(st, mij, nod * 2, pos);
    else Update(mij + 1, dr, nod * 2 + 1, pos);
    Arb[nod] = max(Arb[nod * 2], Arb[nod * 2 + 1]);
}
inline int Query(int st, int dr, int nod, int x, int y){
    if(x <= st && dr <= y) return Arb[nod];
    int mij = (st + dr) / 2;
    int Sol = 0;
    if(mij >= x) Sol = Query(st, mij, nod * 2, x, y);
    if(mij + 1 <= y) Sol = max(Query(mij + 1, dr, nod * 2 + 1, x, y), Sol);
    return Sol;
}
int main()
{
    freopen("pq.in", "r", stdin);
    freopen("pq.out", "w", stdout);
    scanf("%d%d", &n, &q);
    for(int i = 1; i <= n ; ++i)
        scanf("%d", &a[i]);
    for(int i = 1; i <= q ; ++i){
        scanf("%d%d", &Q[i].l, &Q[i].r);
        Q[i].p = i;
    }
    for(int i = n; i >= 1 ; --i){
        b[i].p = i;
        b[i].urm = i;
        if(f[a[i]]) b[i].urm = f[a[i]];
        f[a[i]] = i;
    }
    Build(1, n, 1);
    sort(b + 1, b + n + 1);
    sort(Q + 1, Q + q + 1);
    int j = n;
    for(int i = q; i >= 1 ; --i){
        while(j > 0 && b[j].urm > Q[i].r){
            Update(1, n, 1, b[j].p);
            --j;
        }
        ans[Q[i].p] = Query(1, n, 1, Q[i].l, Q[i].r);
        if(ans[Q[i].p] == 0) ans[Q[i].p] = -1;
    }
    for(int i = 1; i <= q ; ++i)
        printf("%d\n", ans[i]);
    return 0;
}