Cod sursa(job #1750403)

Utilizator brczBereczki Norbert Cristian brcz Data 30 august 2016 09:57:50
Problema Pq Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.38 kb
#include<bits/stdc++.h>
#define maxN 100001
using namespace std;

int arb[4*maxN];
int q,n;
int ans[maxN],arr[maxN],lastApparition[maxN];
vector<pair<int,int>> queries[maxN];

void update(int nod,int st,int dr,int pos,int val){

  if(st == dr){
    arb[nod]=max(val,arb[nod]);
    return;
  }
    int mid=(st+dr)>>1;
    int nextNode=(nod << 1);
    if(pos <= mid){
      update(nextNode,st,mid,pos,val);
    }
    else{
      update(nextNode+1,mid+1,dr,pos,val);
    }
    arb[nod]=max(arb[nextNode],arb[nextNode+1]);

}

int query(int nod,int st,int dr,int qst,int qdr){

  if(st > qdr || dr < qst){
    return 0;
  }
  if(qst <= st && qdr >= dr){
    return arb[nod];
  }

  int nextNode=(nod<<1);
  int mid=(st+dr)>>1;

  return max(query(nextNode,st,mid,qst,qdr),query(nextNode+1,mid+1,dr,qst,qdr));

}

int main(){

  cin >> n >> q;
  for(int i=1;i<=n;i++){
    cin >> arr[i];
  }
  int x,y;
  for(int i=0;i<q;i++){
    cin >> x >> y;
    queries[y].push_back(make_pair(x,i));
  }

  for(int i=1;i<=n;i++){
    if(lastApparition[arr[i]]!=0){
      update(1,1,n,lastApparition[arr[i]],i-lastApparition[arr[i]]);
    }
    lastApparition[arr[i]]=i;

    for(int j=0;j<queries[i].size();j++){
      ans[queries[i][j].second]=query(1,1,n,queries[i][j].first,i);
    }
  }

  for(int i=0;i<q;i++){
    if(ans[i] == 0){
      cout << -1 << '\n';
    }
    else{
      cout << ans[i] << '\n';
    }
  }

  return 0;
}