Cod sursa(job #1713578)

Utilizator antanaAntonia Boca antana Data 5 iunie 2016 23:19:29
Problema Pq Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.77 kb
#include <cstdio>
#include<algorithm>
#define MAX 100000
#define LOG 17
using namespace std;
int rmq[LOG][MAX+1];
struct aa{
    int st, dr;
}v[MAX+1];
int fr[MAX+1], k, l[MAX+1];
inline int maxim(int a, int b)
{
    if(a>b)
        return a;
    return b;
}
bool cresc(const aa &a, const aa &b)
{
    if(a.st<b.st)
        return true;
    if(a.st>b.st)
        return false;
    return (a.dr<b.dr);
}
void calculate(int n)
{
    for(int j=1;(1<<j)<=n;++j)
        for(int i=1;i<=n;++i)
            rmq[j][i]=maxim(rmq[j-1][i], rmq[j-1][i+(1<<(j-1))]);
}
inline int query(int x, int y)
{
    int l1=-1, l2=-1, st, dr, mij, log;
    st=0;
    dr=k;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(v[mij].st<x)
        {
            l1=mij+1;
            st=mij+1;
        }
        else dr=mij-1;
    }
    st=0;
    dr=k;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(v[mij].dr<=y)
        {
            l2=mij;
            st=mij+1;
        }
        else dr=mij-1;
    }
    if(l1<1 || l2<1 || l1>l2)
        return -1;
    for(log=0;(1<<log)<=(l2-l1+1);++log);
    log--;
    return maxim(rmq[log][l1], rmq[log][l2-(1<<log)+1]);
}
int main()
{
    freopen("pq.in", "r", stdin);
    freopen("pq.out", "w", stdout);
    int n, q, x, y;
    scanf("%d%d", &n, &q);
    for(int i=1;i<=n;++i)
    {
        scanf("%d", &x);
        if(fr[x]!=0)
        {
            v[++k].st=fr[x];
            v[k].dr=i;
        }
        fr[x]=i;
    }
    sort(v+1, v+k+1, cresc);
    for(int i=1;i<=k;++i){
        l[i]=v[i].dr-v[i].st;
        rmq[0][i]=l[i];
    }
    calculate(n);
    for(int i=1;i<=q;++i)
    {
        scanf("%d%d", &x, &y);
        printf("%d\n", query(x, y));
    }
    return 0;
}