Cod sursa(job #1771973)

Utilizator GinguIonutGinguIonut GinguIonut Data 6 octombrie 2016 12:47:46
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.9 kb
#include <fstream>
#include <vector>
#include <algorithm>

#define nMax 100001
#define qMax 100001
#define valMax 100001
#define pb push_back
#define lNode 2*node
#define rNode 2*node+1

using namespace std;

ifstream fin("pq.in");
ofstream fout("pq.out");
int n, nrQ;
int Sol[qMax], v[nMax], last[valMax], arb[4*nMax];

struct question
{
    int st;
    int dr;
    int poz;
}q[qMax];

bool cmp(question a, question b)
{
    return a.dr<b.dr;
}

void read()
{
    fin>>n>>nrQ;

    for(int i=1; i<=n; i++)
        fin>>v[i];

    for(int i=1; i<=nrQ; i++)
    {
        fin>>q[i].st>>q[i].dr;
        q[i].poz=i;
    }
}

void upDate(int node, int st, int dr, int poz, int val)
{
    if(st==dr)
    {
        arb[node]=val;
        return;
    }

    int mid=st+(dr-st)/2;
    if(poz<=mid)
        upDate(lNode, st, mid, poz, val);
    else
        upDate(rNode, mid+1, dr, poz, val);

    arb[node]=max(arb[lNode], arb[rNode]);
}

int query(int node, int st, int dr, int pozst, int pozdr)
{
    int Max=0;
    if(st>=pozst && dr<=pozdr)
        return arb[node];

    int mid=st+(dr-st)/2;
    if(pozst<=mid)
        Max=max(Max, query(lNode, st, mid, pozst, pozdr));
    if(pozdr>mid)
        Max=max(Max, query(rNode, mid+1, dr, pozst, pozdr));

    return Max;
}

void solve()
{
    int index=1;
    sort(q+1, q+nrQ+1, cmp);

    for(int i=1; i<=n; i++)
    {
        if(last[v[i]])
            upDate(1, 1, n, last[v[i]], i-last[v[i]]);
        last[v[i]]=i;

        while(q[index].dr<=i && index<=nrQ)
        {
            int Max=query(1, 1, n, q[index].st, q[index].dr);
            if(Max==0)
                Max=-1;

            Sol[q[index].poz]=Max;
            index++;
        }
    }
}

void write()
{
    for(int i=1; i<=nrQ; i++)
        fout<<Sol[i]<<'\n';
}

int main()
{
    read();
    solve();
    write();
}