Cod sursa(job #2571872)

Utilizator sichetpaulSichet Paul sichetpaul Data 5 martie 2020 10:34:43
Problema Pq Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.67 kb
#include <bits/stdc++.h>
#define Nmax 100005
using namespace std;

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

int N, Q;
int aib[Nmax], last[Nmax], v[Nmax], tree[4 * Nmax];

void update(int node, int le, int ri, int pos, int val) {
    if (le == ri) tree[node] = val;
    else {
        int mid = (le + ri) / 2;
        if (pos <= mid) update(2 * node, le, mid, pos, val);
        else update(2 * node + 1, mid + 1, ri, pos, val);
        tree[node] = max(tree[2 * node], tree[2 * node + 1]);
    }
}
int res;
void query(int node, int le, int ri, int a, int b) {
    if (le >= a && ri <= b) res = max(res, tree[node]);
    else {
       int mid = (le + ri) / 2;
       if (a <= mid) query(2 * node, le, mid, a, b);
       if (mid < b) query(2 * node + 1, mid + 1, ri, a, b);
      }
}

struct Query{
   int le, ri, pos, ans;
};
Query q[Nmax];
bool cmp1(Query a, Query b) {
   return a.ri < b.ri;
}
bool cmp2(Query a, Query b) {
   return a.pos < b.pos;
}
int main()
{
    f >> N >> Q;
    for (int i = 1; i <= N; ++i)
        f >> v[i];
    for (int i = 1; i <= Q; ++i)
        f >> q[i].le >> q[i].ri, q[i].pos = i;
    sort(q + 1, q + Q + 1, cmp1);

    for (int i = 1; i <= 4 * N; ++i)
       tree[i] = -1;

    int j = 1;
    for (int i = 1; i <= N; ++i) {
        if (last[v[i]]) update(1, 1, N, last[v[i]], i - last[v[i]]);
        last[v[i]] = i;
        while (j <= Q && q[j].ri == i) {
            res = -1;
            query(1, 1, N, q[j].le, q[j].ri);
            q[j].ans = res;
            ++j;
        }
    }

    sort(q + 1, q + Q + 1, cmp2);
    for (int i = 1; i <= Q; ++i)
         g << q[i].ans << '\n';

    return 0;
}