Cod sursa(job #2455966)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 13 septembrie 2019 11:07:46
Problema Pq Scor 0
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.88 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("pq.in");
ofstream g("pq.out");
int Res[100005], N, Q;
int A[100005], Next[100005];
pair <int, int> I[100005];
int Ord[100005], Last[100005];
int Arb[400005];
bool cmp(int a, int b){
    return I[a] < I[b];
}
void update(int K, int L, int R, int pos, int val){
    if(L > R)
        return;
    if(L == R){
        Arb[K] = val;
        return;
    }
    if(pos > (L + R) / 2)
        update(K * 2 + 1, (L + R) / 2 + 1, R, pos, val);
    else
        update(K * 2, L, (L + R) / 2, pos, val);
    Arb[K] = max(Arb[K * 2], Arb[K * 2 + 1]);
}

int query(int K, int L, int R, int x, int y){
    if(L > R || L > y || R < x)
        return -1;
    if(L >= x && R <= y)
        return Arb[K];
    return max(query(K * 2, L, (L + R) / 2, x, y), query(K * 2 + 1, (L + R) / 2 + 1, R, x, y));
}


void Read(){
    f >> N >> Q;
    for(int i = 1; i <= N; i++){
        f >> A[i];
    }
    for(int i = 1; i <= Q; i++){
        f >> I[i].first >> I[i].second;
        Ord[i] = i;
    }
    sort(Ord + 1, Ord + Q + 1);
}

void precalcNext(){
    for(int i = 1; i <= N; i++){
        if(Last[A[i]] != 0)
            Next[Last[A[i]]] = i;
        Last[A[i]] = i;
    }
}

void Solve(){
    for(int i = 1; i <= N; i++){
        if(Next[i] != 0)
            update(1, 1, N, Next[i], Next[i] - i);
    }
    int left = 1;
    for(int i = 1; i <= Q; i++){
        int x = Ord[i];
        while(left < I[x].first){
            if(Next[left] != 0)
                update(1, 1, N, Next[left], 0);
            ++left;
        }
        Res[Ord[i]] = query(1, 1, N, I[x].first, I[x].second);
    }
    for(int i = 1; i <= Q; i++){
        if(Res[i] == 0)
            Res[i] = -1;
        g << Res[i] << '\n';

    }

}
int main()
{
    Read();
    precalcNext();
    Solve();
    return 0;
}