Cod sursa(job #1716355)

Utilizator vancea.catalincatalin vancea.catalin Data 12 iunie 2016 16:11:57
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.58 kb
#include<algorithm>
#include<iostream>
#include<fstream>
#include<vector>
#define DN 100100
using namespace std;
fstream fin("pq.in",ios::in),fout("pq.out",ios::out);
int n,q,ai[DN*4],x[DN],maxim,ap[DN];
struct str{int a,b,poz,val;};
vector<str> v;
bool cmp1(str a,str b){
    return (a.b<b.b);
}
bool cmp2(str a,str b){
    return a.poz<b.poz;
}
void update(int nod,int st,int dr,int poz,int val)
{
    if(st==dr && st==poz) ai[nod]=val;
    if(dr<poz || poz<st || st==dr) return ;
    int m=(st+dr)/2,c1=nod*2,c2=nod*2+1;
    update(c1,st,m,poz,val);
    update(c2,m+1,dr,poz,val);
    ai[nod]=max(ai[c1],ai[c2]);
}
void query(int nod,int st,int dr,int stq,int drq)
{
    if(dr<stq || drq<st) return ;
    int m=(st+dr)/2,c1=nod*2,c2=nod*2+1;
    if(stq<=st && dr<=drq)
    {
        maxim=max(maxim,ai[nod]);
        return ;
    }
    query(c1,st,m,stq,drq);
    query(c2,m+1,dr,stq,drq);
}
int main()
{
    int a,b,i,j=1,dist;
    fin>>n>>q;
    for(i=1;i<=n;i++)
        fin>>x[i];
    for(i=1;i<=q;i++)
    {
        fin>>a>>b;
        v.push_back({a,b,i,0});
    }
    sort(v.begin(),v.end(),cmp1);
    for(i=0;i<q;i++)
    {
        a=v[i].a;
        b=v[i].b;
        for( ;j<=b;j++)
        {
            if(ap[x[j]]!=0)
            {
                dist=(j-ap[x[j]]);
                update(1,1,n,ap[x[j]],dist);
            }
            ap[x[j]]=j;
        }
        maxim=0;
        query(1,1,n,a,b);
        v[i].val=maxim;
    }
    sort(v.begin(),v.end(),cmp2);
    for(i=0;i<q;i++)
    {
        if(v[i].val==0)
            fout<<"-1\n";
        else
            fout<<v[i].val<<"\n";
    }
}