Cod sursa(job #1709461)

Utilizator liisLIIS-Horia-Vlad-Denis liis Data 28 mai 2016 12:24:09
Problema Pq Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.73 kb
#include <fstream>
#include <deque>
#include <algorithm>
using namespace std;

ifstream f("pq.in");
ofstream g("pq.out");

long n,i,j,q,rez[100005],lg,st,last[100005],rez2[100005];
deque<int> dq;

struct interval{
    long x,y,poz;
}C[100005],Q[100005];

bool comp(interval a,interval b)
{
    if (a.y==b.y)
        return a.x<b.x;
    return a.y<b.y;
}
bool comp2(interval a,interval b)
{
    if (a.x==b.x)
        return a.y<b.y;
    return a.x<b.x;
}

int main()
{
    f>>n>>q;
    for (i=1;i<=n;i++)
    {
        int x;
        f>>x;
        if (last[x]!=0)
        {
            C[++lg].x = last[x];
            C[lg].y = i;
        }
        last[x]=i;
    }
    for (i=1;i<=q;i++)
    {
        f>>Q[i].x>>Q[i].y;
        Q[i].poz=i;
    }
    sort(C+1,C+lg+1,comp);
    sort(Q+1,Q+q+1,comp2);

st=1;
    i=1;
    j=1;
    while (st<=lg && j<=q)
    {

        while (C[i].y<=Q[j].y && C[i].x>=Q[j].x)
        {
            int sav=C[i].y-C[i].x+1;
            while (!dq.empty() && C[dq.back()].y-C[dq.back()].x+1<=sav)
            {
                dq.pop_back();
                st++;
            }
            dq.push_back(i);
            i++;
        }

        while (C[st].x<Q[j].x && C[st].y<=Q[j].y && !dq.empty())
        {
            if (dq.front()==st)
                dq.pop_front();

            st++;
        }


            if (!dq.empty())
                rez[j]=C[dq.front()].y-C[dq.front()].x;
            else
                rez[j]=-1;
            j++;

    }


    for (i=1;i<=q;i++)
    {
        if (rez[i]==0)
            rez[i]=-1;
        rez2[Q[i].poz] = rez[i];
    }

    for (i=1;i<=q;i++)
        g<<rez2[i]<<'\n';

    return 0;
}