Cod sursa(job #1709273)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 28 mai 2016 11:34:08
Problema Pq Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.81 kb
#include <stdio.h>
#include <algorithm>
#include <vector>

#define maxdim 100005

using namespace std;

int n, q;
int a[maxdim], urm[maxdim];
vector<pair<int, pair<int, int>>> queries;
vector<pair<int, int>> events;
int sol[maxdim], arb[4 * maxdim];

void update(int nod, int st, int dr, int poz, int val) {
  if (st == dr) {
    arb[nod] = val;
    return;
  }

  int mij = (st + dr) >> 1;
  int nodst = nod << 1;
  int noddr = nodst | 1;

  if (poz <= mij) {
    update(nodst, st, mij, poz, val);
  } else {
    update(noddr, mij + 1, dr, poz, val);
  }
  arb[nod] = max(arb[nodst], arb[noddr]);
}

void query(int nod, int st, int dr, int a, int b, int &sol) {
  if (a <= st && dr <= b) {
    if (arb[nod]) {
      sol = max(sol, arb[nod]);
    }
    return;
  }

  int mij = (st + dr) >> 1;
  int nodst = nod << 1;
  int noddr = nodst | 1;

  if (a <= mij) {
    query(nodst, st, mij, a, b, sol);
  }
  if (b > mij) {
    query(noddr, mij + 1, dr, a, b, sol);
  }
}
 
int main() {
  freopen("pq.in", "r", stdin);
  freopen("pq.out", "w", stdout);

  scanf("%d %d", &n, &q);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &a[i]);
  }
  for (int i = 1; i <= q; ++i) {
    int x, y; scanf("%d %d", &x, &y);
    queries.push_back(make_pair(y, make_pair(x, i)));
  }

  for (int i = n; i >= 1; --i) {
    if (urm[a[i]]) {
      events.push_back(make_pair(urm[a[i]], i));
    }
    urm[a[i]] = i;
  }
  
  sort(queries.begin(), queries.end());
  sort(events.begin(), events.end());
  int p = 0;
  for (auto &q : queries) {
    while (p < events.size() && events[p].first <= q.first) {
      update(1, 1, n, events[p].second, events[p].first - events[p].second);
      ++p;
    }
    sol[q.second.second] = -1;
    query(1, 1, n, q.second.first, q.first, sol[q.second.second]);
  }

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