Cod sursa(job #2246257)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 26 septembrie 2018 21:10:58
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.17 kb
#include<fstream>
#include<algorithm>
#define st first.first
#define dr first.second
#define ind second
using namespace std;
ifstream fi("pq.in");
ofstream fo("pq.out");
pair<pair<int,int>,int> Q[100005];
int A[100005],Lst[100005],Rez[100005],F[100005];
int n,q,ind,i;

void upd(int poz, int val)
{
    while(poz<=n)
    {
        F[poz]=max(F[poz],val);
        poz=poz+(poz&(poz^(poz-1)));
    }
}

int qu(int poz)
{
    int rez=0;
    while(poz>=1)
    {
        rez=max(rez,F[poz]);
        poz=poz-(poz&(poz^(poz-1)));
    }
    return rez;
}

int main()
{
    fi>>n>>q;
    for(i=1; i<=n; i++)
        fi>>A[i];
    for(i=1; i<=q; i++)
    {
        fi>>Q[i].st>>Q[i].dr;
        Q[i].ind=i;
    }
    sort(Q+1,Q+q+1);
    ind=q;
    for(i=n; i>=1; i--)
    {
        if(Lst[A[i]]!=0)
            upd(Lst[A[i]],Lst[A[i]]-i);
        Lst[A[i]]=i;
        while(Q[ind].st==i)
        {
            Rez[Q[ind].ind]=qu(Q[ind].dr);
            ind--;
        }
    }
    for(i=1; i<=q; i++)
        if(Rez[i]==0)
            fo<<"-1\n";
        else
            fo<<Rez[i]<<"\n";
    fi.close();
    fo.close();
    return 0;
}