Cod sursa(job #1713891)

Utilizator antanaAntonia Boca antana Data 6 iunie 2016 21:10:47
Problema Pq Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 2.14 kb
#include <cstdio>
#include<algorithm>
#define MAX 100000
#define LOG 20
using namespace std;
struct aa{
    int x, y, ind, rasp;
}q[MAX+1], intr[MAX+1];
int v[MAX+1], n, m, fr[MAX+1], k, arb[(1<<LOG)+1];
inline int maxim(int a, int b)
{
    if(a>b)
        return a;
    return b;
}
bool cresc1(const aa &a, const aa &b)
{
    if(a.x<b.x)
        return true;
    if(a.x>b.x)
        return false;
    return (a.y<b.y);
}
bool cresc2(const aa &a, const aa &b)
{
    return (a.ind<b.ind);
}
void update(int poz, int val, int st, int dr, int nod)
{
    int mij=(st+dr)/2;
    if(st==dr){
        arb[nod]=val;
        return;
    }
    if(poz<=mij)
        update(poz, val, st, mij, nod*2);
    else update(poz, val, mij+1, dr, nod*2+1);
    arb[nod]=maxim(arb[nod*2], arb[nod*2+1]);
}
int query(int x, int y, int st, int dr, int nod)
{
    int mij=(st+dr)/2, m1=0, m2=0;
    if(st>=x && dr<=y)
        return arb[nod];
    if(x<=mij)
        m1=query(x, y, st, mij, nod*2);
    if(y>mij)
        m2=query(x, y, mij+1, dr, nod*2+1);
    return maxim(m1, m2);
}
int main()
{
    freopen("pq.in", "r",stdin);
    freopen("pq.out", "w", stdout);
    int st, dr;
    scanf("%d%d", &n, &m);
    for(int i=1;i<=n;++i){
        scanf("%d", &v[i]);
        if(fr[v[i]]!=0)
        {
            intr[++k].x=fr[v[i]];
            intr[k].y=i;
        }
        fr[v[i]]=i;
    }
    for(int i=1;i<=m;++i){
        scanf("%d%d", &q[i].x, &q[i].y);
        q[i].ind=i;
    }
    sort(q+1,q+m+1, cresc1);
    sort(intr+1, intr+k+1, cresc1);
    st=dr=1;
    for(int i=1;i<=m;++i)
    {
        while(intr[st].x<q[i].x){
            update(intr[st].y, 0, 1, n, 1);
            st++;
        }
        if(st>dr)
            dr=st;
        while(intr[dr].x>=q[i].x && intr[dr].y<=q[i].y)
        {
            update(intr[dr].y, intr[dr].y-intr[dr].x, 1, n, 1);
            dr++;
        }
        q[i].rasp=query(q[i].x, q[i].y, 1, n, 1);
    }
    sort(q+1, q+m+1, cresc2);
    for(int i=1;i<=m;++i){
        if(!q[i].rasp)
            printf("-1\n");
        else printf("%d\n", q[i].rasp);
    }
    return 0;
}