Cod sursa(job #2639477)

Utilizator StanCatalinStanCatalin StanCatalin Data 2 august 2020 13:03:18
Problema Pq Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

ifstream in("pq.in");
ofstream out("pq.out");

const int dim = 100005;

struct event
{
    int x;
    int y;
    int i;
};

vector <event> vec;

int n,a[dim],poz[dim],q,arb[4*dim],rasp = -1,sa_fie[dim];

bool cmp(event a,event b)
{
    return (a.y < b.y);
}

void Update(int nod,int st,int dr,int poz,int val)
{
    if (st == dr)
    {
        arb[nod] = val;
        return ;
    }
    int mid = (st+dr)/2;

    if (poz <= mid) Update(2*nod, st,mid, poz, val);
    else Update(2*nod+1, mid+1,dr,poz,val);
    arb[nod] = max(arb[2*nod], arb[2*nod + 1]);
}

void Query(int nod,int st,int dr,int a,int b)
{
    if (a <= st && dr <= b)
    {
        rasp = max(rasp, arb[nod]);
        return ;
    }
    int mid = (st+dr)/2;
    if (a <= mid)
    {
        Query(2*nod,st,mid,a,b);
    }
    if (b > mid)
    {
        Query(2*nod +1,mid+1,dr,a,b);
    }
}

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

    ///cout <<"ok\n";
    int x,y;
    for (int j=1; j<=q; j++)
    {
        in >> x >> y;
        vec.push_back({x,y,j});
    }
    sort(vec.begin(), vec.end(), cmp);
    int j = 0;
    for (int i=1; i<=n; i++)
    {
        if (poz[a[i]])
        {
            Update(1,1,n,poz[a[i]], i-poz[a[i]]);
        }
        poz[a[i]] = i;
        while(j < q && vec[j].y == i)
        {
            rasp = -1;
            Query(1, 1, n, vec[j].x, vec[j].y);
            if (rasp == 0) rasp = -1;
            sa_fie[vec[j].i] = rasp;
            j++;
        }
    }
    for (int j=1; j<=q; j++)
    {
        out << sa_fie[j] << "\n";
    }
    return 0;
}