Cod sursa(job #1710025)

Utilizator UTCN_FrunzaUTCN Lazar Nitu Petruta UTCN_Frunza Data 28 mai 2016 14:49:10
Problema Pq Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 2.71 kb
#include<cstdio>
#include<algorithm>

using namespace std;

int n,q, nr;

int arb[1000000];

struct balena
{
    int tip;
    int idxs;
    int idxf;
    int idxInit;
}baleie[200010];

struct inde
{
    int val;
    int idx;
}a[100010];

int rez[100010];

bool fcomp(inde a, inde b)
{
    if(a.val - b.val)
    {
        return a.val < b.val;
    }

    return a.idx < b.idx;
}

bool fcomp1(balena a, balena b)
{
    if(a.idxf - b.idxf)
    {
        return a.idxf < b.idxf;
    }

    return a.tip < b.tip;
}

int maxi(int x, int y)
{
    if( x > y)
    {
        return x;
    }

    return y;
}

void update(int st, int dr, int i, int p, int val)
{
    int mij = (st + dr) / 2;

    if(st == dr)
    {
        arb[i] = val;
        return ;
    }

    if(p <= mij)
    {
        update(st, mij, 2 * i, p, val);
    }
    else
    {
        update(mij+1, dr, 2 * i +1, p, val);
    }

    arb[i] = maxi(arb[i*2], arb[i*2+1]);
}

int query(int st, int dr, int i, int p, int q)
{
    if(p <=  st && dr <= q)
    {
        return arb[i];
    }

    int mij = (st+dr) / 2;

    int rez1 = 0;
    if(p <= mij)
    {
        rez1 = query(st, mij, i*2, p, q);
    }
    int rez2 = 0;
    if(q > mij)
    {
        rez2 = query(mij+1, dr, i*2+1, p, q);
    }

    return maxi(rez1,rez2);
}

int main()
{

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

    scanf("%d%d", &n, &q);

    for(int i = 1; i<=n; ++i)
    {
        scanf("%d", &a[i].val);
        a[i].idx = i;
    }

    sort(a+1, a+n+1, fcomp);

    for(int i = 1; i<n; ++i)
    {
        if(a[i].val == a[i+1].val)
        {
            baleie[++nr].tip = 1;
            baleie[nr].idxs = a[i].idx;
            baleie[nr].idxf = a[i+1].idx;
        }
    }


    //for(int i = 1; i<n; ++i)
  //  {
   // printf("%d %d %d\n", baleie[i].tip, baleie[i].idxs, baleie[i].idxf);
   // }


    for(int i = 1; i<= q; ++i)
    {
        baleie[++nr].tip = 2;
        baleie[nr].idxInit = i;
        scanf("%d%d", &baleie[nr].idxs,&baleie[nr].idxf);
    }



    sort(baleie+1, baleie + nr + 1, fcomp1);

    for(int i = 1; i<=nr; ++i)
    {
        if(baleie[i].tip == 1)
        {
            update(1,n,1, baleie[i].idxs, baleie[i].idxf - baleie[i].idxs);
        }
        else
        {
            rez[baleie[i].idxInit] = query(1,n,1, baleie[i].idxs, baleie[i].idxf);
        }
    }

    for(int i = 1; i<=q; ++i)
    {
        if(rez[i] == 0)
        {
            printf("-1\n");
        }
        else
        {
            printf("%d\n", rez[i]);
        }
    }

    fclose(stdin);
    fclose(stdout);

    return 0;
}