Cod sursa(job #1709410)

Utilizator forsakenAweUNIBUC Suditu Cornoiu Chihai forsakenAwe Data 28 mai 2016 12:08:20
Problema Pq Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 2.31 kb
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second

int arbint[400100];

int n,q;
int a[100100];
pair<pair<int,int>,int> Q[100100];

int nxt[100100];
int pre[100100];


int ap[100100];




void build(int nod, int l, int r)
{
    if (l == r) {
        arbint[nod] = 0;
        return;
    }
    int mid = (l + r) >> 1;
    build(2*nod,l,mid);
    build(2*nod+1,mid+1,r);
    arbint[nod] = max(arbint[2*nod],arbint[2*nod+1]);
}

void update(int nod, int l, int r, int pos, int val)
{
    if (l == r) {
        arbint[nod] = val;
        return;
    }
    int mid = (l + r) >> 1;
    if (pos <= mid) update(2*nod,l,mid,pos,val);
        else update(2*nod+1,mid+1,r,pos,val);
    arbint[nod] = max(arbint[2*nod],arbint[2*nod+1]);
}
int query(int nod, int l, int r, int a, int b)
{
    if (l == a && r == b) {
        return arbint[nod];
    }
    int mid = (l + r) >> 1;
    if (b <= mid) return query(2*nod, l,mid,a,b);
    else if (a >mid) return query(2*nod+1,mid+1,r,a,b);
    else return max(
                    query(2*nod,l,mid,a,mid),
                    query(2*nod+1,mid+1,r,mid+1,b)
                    );
}


int main()
{
     freopen("pq.in","r",stdin);
    freopen("pq.out","w",stdout);

    cin>>n>>q;
    for(int i=1;i<=n;i++) {
        scanf("%d", &a[i]);
    }

    for (int i = 1; i<= n;i++) {
        if (ap[a[i]]) {
            pre[i] = ap[a[i]];
            nxt[ap[a[i]]] = i;
        }
        ap[a[i]] = i;
    }

    for(int i=1;i<=q;i++) {
        scanf("%d%d",&Q[i].fi.fi,&Q[i].fi.se);
        Q[i].se = i;
    }
    sort(Q+1,Q+q+1);

    build(1,1,n);


    Q[0].fi.fi = Q[0].fi.se = 1;
    int maxR=0;
    for(int i = 1; i <= q;i++) {
        int l = Q[i].fi.fi, r = Q[i].fi.se;
        int prel = Q[i - 1].fi.fi, prer = Q[i - 1].fi.se;

        if (maxR < r) {
            for(int j = maxR + 1; j <= r; j++) {
                if (nxt[j] != 0)
                    update(1,1,n,nxt[j], nxt[j] - j);
            }
            maxR = r;
        }

        for (int j = prel; j < l; j++) {
                if (nxt[j])
                    update(1,1,n,nxt[j],0);
        }


        int rs = query(1,1,n,l,r);
        if (rs == 0) rs = -1;
        printf("%d\n",rs);
    }






    return 0;
}