Cod sursa(job #1894446)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 26 februarie 2017 20:32:56
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.63 kb
#include <bits/stdc++.h>
using namespace std;

struct q{
    int l, r, i;
}Q[100005];
int v[100005], last[100005];
int aint[400005];
int ans[100005];
int qlf, qrg, val;

bool comp(q a, q b){
    return a.r < b.r;
}

void update(int pos, int lf, int rg){
    if(lf > qlf || rg < qlf){
        return;
    }
    if(lf == rg){
        aint[pos] = val;
        return;
    }
    int md = (lf + rg)/2;
    update(2 * pos, lf, md);
    update(2 * pos + 1, md + 1, rg);
    aint[pos] = max(aint[2 * pos], aint[2 * pos + 1]);
}

int query(int pos, int lf, int rg){
    if(lf > qrg || rg < qlf){
        return 0;
    }
    if(qlf <= lf && rg <= qrg){
        return aint[pos];
    }
    int md = (lf + rg)/2;
    return max(query(2 * pos, lf, md), query(2 * pos + 1, md + 1, rg));
}

int main()
{
    freopen("pq.in", "r", stdin);
    freopen("pq.out", "w", stdout);
    int n,q,i;
    scanf("%d %d", &n, &q);
    for(i = 1;i <= n;i++){
        scanf("%d", &v[i]);
    }
    for(i = 1;i <= q;i++){
        scanf("%d %d", &Q[i].l, &Q[i].r);
        Q[i].i = i;
    }
    sort(Q + 1, Q + q + 1, comp);
    int j;
    for(i = 1;i <= q;i++){
        for(j = Q[i - 1].r + 1;j <= Q[i].r;j++){
            if(last[v[j]]){
                qlf = last[v[j]];
                val = j - last[v[j]];
                update(1, 1, n);
            }
            last[v[j]] = j;
        }
        qlf = Q[i].l;
        qrg = Q[i].r;
        ans[Q[i].i] = query(1, 1, n);
    }
    for(i = 1;i <= q;i++){
        if(ans[i] == 0){
            ans[i] = -1;
        }
        printf("%d\n", ans[i]);
    }

    return 0;
}