Cod sursa(job #1709151)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 28 mai 2016 11:03:57
Problema Pq Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.98 kb
#include <bits/stdc++.h>

using namespace std;

const int N_MAX = 100005;
const int V_MAX = 100005;
const int Q_MAX = 100005;

class Query {  
   public:
      int iLeft;
      int iRight;
      int idx;
      
      Query(int _iLeft = 0, int _iRight = 0, int _idx = 0) :
         iLeft(_iLeft), iRight(_iRight), idx(_idx) {}
      bool operator <(const Query &o) const {
         return iLeft < o.iLeft;
      }
};

int N, Q;
int toRemove[N_MAX];
int lastOccurrence[V_MAX];
int tree[4 * N_MAX];
Query queries[Q_MAX];
int qans[Q_MAX];

void SegUpdate(int p, int v, int x, int l, int r) {
   if(p < l || r < p) return;
   if(l == r) {
      tree[x] = v;
      return;
   }
   int m = (l + r) >> 1;
   SegUpdate(p, v, x << 1, l, m);
   SegUpdate(p, v, x << 1 | 1, m + 1, r);
   tree[x] = max(tree[x << 1], tree[x << 1 | 1]);
}

int SegQuery(int i, int j, int x, int l, int r) {
   if(j < l || r < i) return 0;
   if(i <= l && r <= j) return tree[x];
   int m = (l + r) >> 1;
   return max(SegQuery(i, j, x << 1, l, m), SegQuery(i, j, x << 1 | 1, m + 1, r));
}

int main() {
   ifstream f("pq.in");
   ofstream g("pq.out");
   
   f >> N >> Q;
   
   for(int i = 1, v; i <= N; i++) {
      f >> v;
      if(lastOccurrence[v] > 0) {
         SegUpdate(i, i - lastOccurrence[v], 1, 1, N);
         toRemove[lastOccurrence[v] + 1] = i;
      }
      lastOccurrence[v] = i;
   }
   
   for(int i = 1, x, y; i <= Q; i++) {
      f >> x >> y;
      queries[i] = Query(x, y, i);
   }
   
   sort(queries + 1, queries + Q + 1);
   
   for(int i = 1, j = 1; i <= Q; i++) {
      while(j <= queries[i].iLeft) {
         if(toRemove[j]) {
            SegUpdate(toRemove[j], 0, 1, 1, N);
         }
         ++j;
      }
      int cAnswer = SegQuery(queries[i].iLeft, queries[i].iRight, 1, 1, N);
      if(cAnswer == 0) cAnswer = -1;
      qans[queries[i].idx] = cAnswer;
   }
   
   for(int i = 1; i <= Q; i++)
      g << qans[i] << '\n';
   
   return 0;
}