Cod sursa(job #1713135)

Utilizator stoianmihailStoian Mihail stoianmihail Data 4 iunie 2016 19:51:07
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 2.71 kb
#include <stdio.h>

#define treeSize 131072
#define Nadejde 100000

struct pair {
  int b, e, init;

  pair() {
  
  }

  bool operator < (pair &other) {
    return this -> b < other.b;
  }
};

int N, Q, max;
pair sorted[Nadejde + 1];
int next[Nadejde + 1];
int dist[Nadejde + 1];
int last[Nadejde];
int tree[2 * treeSize];
int answer[Nadejde + 1];

void sort(int begin, int end) {
  int b = begin, e = end;
  pair tmp, pivot = sorted[(b + e) / 2];

  while (b <= e) {
    while (sorted[b] < pivot) {
      b++;
    }
    while (pivot < sorted[e]) {
      e--;
    }
    if (b <= e) {
      tmp = sorted[b];
      sorted[b++] = sorted[e];
      sorted[e--] = tmp;
    }
  }
  if (begin < e) {
    sort(begin, e);
  }
  if (b < end) {
    sort(b, end);
  }
}

int MAX(int X, int Y) {
  return X > Y ? X : Y;
}

void build(int u, int left, int right) {
  if (left == right) {
    tree[u] = dist[left];
    return;
  }

  int mid = (left + right) / 2;
  build(2 * u, left, mid);
  build(2 * u + 1, mid + 1, right);
  tree[u] = MAX(tree[2 * u], tree[2 * u + 1]);
}

void update(int u, int left, int right, int a) {
  if (left == right) {
    tree[u] = 0;
    return;
  }

  int mid = (left + right) / 2;
  if (a <= mid) {
    update(2 * u, left, mid, a);
  } else {
    update(2 * u + 1, mid + 1, right, a);
  }
  tree[u] = MAX(tree[2 * u], tree[2 * u + 1]);
}

void query(int u, int left, int right, int a, int b) {
  if (a <= left && right <= b) {
    if (tree[u] > max) {
      max = tree[u];
    }
    return;
  }

  int mid = (left + right) / 2;
  if (a <= mid) {
    query(2 * u, left, mid, a, b);
  }
  if (b > mid) {
    query(2 * u + 1, mid + 1, right, a, b);
  }
}

int main(void) {
  int i, j, k, x;
  FILE *f = fopen("pq.in", "r");

  /* Citirea datelor. */
  fscanf(f, "%d %d", &N, &Q);
  for (i = 1; i <= N; i++) {
    fscanf(f, "%d", &x);
    if (last[x]) {
      dist[i] = i - last[x];
      next[last[x]] = i;
    }
    last[x] = i;
  }
  for (i = 1; i <= Q; i++) {
    fscanf(f, "%d %d", &sorted[i].b, &sorted[i].e);
    sorted[i].init = i;
  }
  fclose(f);

  /* Initializarea datelor. */
  sort(1, Q);
  build(1, 1, N);

  /* Calcularea solutiei. */
  i = 1;
  while (i <= Q) {
    j = i;
    while (j <= Q && sorted[i].b == sorted[j].b) {
      max = 0;
      query(1, 1, N, sorted[j].b, sorted[j].e);
      answer[sorted[j].init] = max;
      j++;
    }
    if (j <= Q) {
      for (k = sorted[i].b; k < sorted[j].b; k++) {
        if (next[k]) {
          update(1, 1, N, next[k]);
        }
      }
    }
    i = j;
  }

  /* Afisarea solutiei. */
  freopen("pq.out", "w", stdout);
  for (i = 1; i <= Q; i++) {
    fprintf(stdout, "%d\n", answer[i] == 0 ? -1 : answer[i]);
  }
  fclose(stdout);

  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}