Cod sursa(job #1713084)

Utilizator andreiudilaUdila Andrei andreiudila Data 4 iunie 2016 17:26:03
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.73 kb
#include <fstream>
#include <cstring>
#include <algorithm>

using namespace std;
ifstream fin("pq.in");
ofstream fout("pq.out");

int n,i,q,j;
int l[100001],r[100001],aux[100001],a[100001],sol[100001];
int h[400001];
struct intrebare{

int l,r,idx;
}v[100001];

bool cmp(intrebare a, intrebare b){

return a.l<b.l;

}

void update(int nod, int l, int r, int poz, int val)
{
    if(l==r) h[nod]=val;
    else
    {
        int mid=(l+r)/2;
        if(poz<=mid)
            update(2*nod,l,mid,poz,val);
        else update(2*nod+1,mid+1,r,poz,val);

        h[nod]=max(h[2*nod],h[2*nod+1]);
    }

}

int query(int nod, int l, int r, int st, int dr)
{
    int aux1=0, aux2=0;
    if(l>=st && r<=dr) return h[nod];
    else
    {
        int mid=(l+r)/2;

        if(st<=mid) aux1=query(2*nod,l,mid,st,dr);
        if(dr>mid) aux2=query(2*nod+1, mid+1,r,st,dr);
    }

    return max(aux1,aux2);
}

int main()
{
    fin>>n>>q;
    for(i=1;i<=n;++i) fin>>a[i];

    for(i=1;i<=q;++i) fin>>v[i].l>>v[i].r,v[i].idx=i;


    for(i=1;i<=n;++i)
    {
        if(aux[a[i]]==0) aux[a[i]]=i;
        l[i]=aux[a[i]];
        aux[a[i]]=i;
    }

    memset(aux,sizeof(aux),0);

    for(i=n;i>=1;--i)
    {
        if(aux[a[i]]==0) aux[a[i]]=0;
        r[i]=aux[a[i]];
        aux[a[i]]=i;
    }

    sort(v+1,v+q+1,cmp);

    for(i=1;i<=n;++i)
    {
     update(1,1,n,i,i-l[i]);
    }

    j=1;

    for(i=1;i<=n;++i)
    {
        while(j<=q && v[j].l==i)
        {
            sol[v[j].idx]=query(1,1,n,v[j].l,v[j].r);
            ++j;
        }

        update(1,1,n,r[i],-1);
    }

    for(i=1;i<=q;++i) if(sol[i]>0) fout<<sol[i]<<"\n";
    else fout<<"-1"<<"\n";

     return 0;
}