Cod sursa(job #1708968)

Utilizator team_nameUPB Banu Popa Visan team_name Data 28 mai 2016 10:24:32
Problema Pq Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.96 kb
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;

#define leftson (2 * node)
#define rightson (2 * node + 1)

const int nmax = 100010;

int n, q, a[nmax], prv[nmax], l, r, ans[nmax], aint[4 * nmax];
vector<pair<int, int> > qr[nmax];
map<int, int> seen;

void update(int node, int left, int right, int pos, int val)
{
    if (left == right)
    {
        aint[node] = val;
        return ;
    }
    int mid = (left + right) / 2;
    if (pos <= mid)
        update(leftson, left, mid, pos, val);
    else 
        update(rightson, mid + 1, right, pos, val);

    aint[node] = max(aint[leftson], aint[rightson]);
}

int query(int node, int left, int right, int leftb, int rightb)
{
    if (leftb <= left && right <= rightb)
        return aint[node];
    int mid = (left + right) / 2, now = 0;
    if (leftb <= mid) now = max(now, query(leftson, left, mid, leftb, rightb));
    if (mid < rightb) now = max(now, query(rightson, mid + 1, right, leftb, rightb));
    return now;
}

int main()
{
    freopen("pq.in", "r", stdin);
    freopen("pq.out", "w", stdout);

    scanf("%i %i", &n, &q);
    for (int i = 1; i <= n; ++ i) scanf("%i", &a[i]);
    for (int i = 1; i <= q; ++ i)
    {
        scanf("%i %i", &l, &r);
        qr[r].push_back(make_pair(l, i));
    }

    for (int i = 1; i <= n; ++ i)
    {
        if (seen[a[i]])
            prv[i] = seen[a[i]];
        else
            prv[i] = -1;
        seen[a[i]] = i;
    }

    for (int i = 1; i <= n; ++ i)
        update(1, 1, n, i, 0);

    for (int i = 1; i <= n; ++ i)
    {
        if (prv[i] != -1)
            update(1, 1, n, prv[i], i - prv[i]);

        for (int j = 0; j < qr[i].size(); ++ j)
        {
            int left = qr[i][j].first, ind = qr[i][j].second, right = i;
            ans[ind] = query(1, 1, n, left, right);
            if (ans[ind] == 0)
                ans[ind] = -1;
        }
    }

    for (int i = 1; i <= q; ++ i)
        printf("%i\n", ans[i]);
}