Cod sursa(job #2244720)

Utilizator TudoseSanzianaTudose Sanziana TudoseSanziana Data 23 septembrie 2018 15:21:38
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.9 kb
#include <bits/stdc++.h>
using namespace std;

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

const int N_MAX = 1e5, Q_MAX = 1e5, A_MAX = 99999;

struct Query
{
    int st, dr, ind;
    bool operator <(const Query& other) const
    {
        if(dr == other.dr)
            return st < other.st;
        return dr < other.dr;
    }
};

int n, m;
int a[N_MAX + 2];
Query q[Q_MAX + 2];

int ans[Q_MAX + 2], last[A_MAX + 2];
int aint[4 * N_MAX + 2];

void update(int node, int st, int dr, int pos, int val)
{
    if(st == dr)
    {
        aint[node] = val;
        return;
    }

    int med = (st + dr) / 2;
    if(pos <= med)
        update(2 * node, st, med, pos, val);
    else
        update(2 * node + 1, med + 1, dr, pos, val);

    aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}

int query(int node, int st, int dr, int querySt, int queryDr)
{
    if(querySt <= st && dr <= queryDr)
        return aint[node];

    int med = (st + dr) / 2, maxSt = 0, maxDr = 0;
    if(querySt <= med)
        maxSt = query(2 * node, st, med, querySt, queryDr);
    if(med < queryDr)
        maxDr = query(2 * node + 1, med + 1, dr, querySt, queryDr);

    return max(maxSt, maxDr);
}

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

    for(int i = 1; i <= m; i++)
    {
        in >> q[i].st >> q[i].dr;
        q[i].ind = i;
    }

    sort(q + 1, q + m + 1);

    int j = 1;
    for(int i = 1; i <= n; i++)
    {
        if(last[a[i]])
            update(1, 1, n, last[a[i]], i - last[a[i]]);
        last[a[i]] = i;

        while(q[j].dr == i)
        {
            int val = query(1, 1, n, q[j].st, q[j].dr);
            if(val == 0)
                val = -1;

            ans[q[j].ind] = val;
            j++;
        }
    }

    for(int i = 1; i <= m; i++)
        out << ans[i] << '\n';

    return 0;
}