Cod sursa(job #2932407)

Utilizator robert.barbu27robert barbu robert.barbu27 Data 2 noiembrie 2022 19:59:56
Problema Pq Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.66 kb
#include <bits/stdc++.h>
#define nl '\n'
#define pb push_back
#define ll long long
#define VMAX 100001
#define NMAX 100005
#define INF -100000000000000000

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

int N,Q,prec[100005],lst[100005];
vector<pair<int,int> > queryes[100005];
int aint[400005],answer[400005];
void update(int nod,int st,int dr,int poz,int val)
{
    if(st==dr)
    {
        aint[nod]=max(aint[nod],val);
        return;
    }
    int mij=(st+dr)/2;
    if(poz<=mij)
    {
        update(2*nod,st,mij,poz,val);
    }
    else
    {
        update(2*nod+1,mij+1,dr,poz,val);
    }
    aint[nod]=max(aint[2*nod],aint[2*nod+1]);
    //cout<<nod<<" "<<aint[nod]<<'\n';
}
int query(int nod,int st,int dr,int qst,int qdr)
{
    if(qst<=st&&dr<=qdr)
    {
        return aint[nod];
    }
    int mij=(st+dr)/2;
    int Mx=-1;
    if(qst<=mij)
    {
        Mx=max(query(2*nod,st,mij,qst,qdr),Mx);
    }
    if(qdr>mij)
    {
        Mx=max(query(2*nod+1,mij+1,dr,qst,qdr),Mx);
    }
    return Mx;
}
int main()
{
    f>>N>>Q;
    for(int i=1;i<=N;i++)
    {
        int x;
        f>>x;
       prec[i]=lst[x];
       lst[x]=i;

    }
    memset(aint,-1,sizeof(aint));
    for(int i=1;i<=Q;i++)
    {
        int l,r;
        f>>l>>r;
        queryes[r].push_back({l,i});
    }
    for(int i=1;i<=N;i++)
    {
        //cout<<i-prec[i]<<'\n';
        if(prec[i]) update(1,1,N,prec[i],i-prec[i]);
        for(auto x:queryes[i])
        {
            answer[x.second]=query(1,1,N,x.first,i);
        }
    }
    //cout<<'\n';
    for(int i=1;i<=Q;i++)
    {
        g<<answer[i]<<'\n';
    }
}