Cod sursa(job #1709349)

Utilizator ubb_oprimabuzurile_2016UBB - OprimAbuzurile2016 - Petru Bianca Cosmin ubb_oprimabuzurile_2016 Data 28 mai 2016 11:54:13
Problema Pq Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.67 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <set>
#include <cstdio>
#define LL long long
#define x first
#define y second
#define mp make_pair
#define DN 100005
using namespace std;

typedef pair<int,int> per;

int n,m,v[DN],ai[4*DN],rz[DN],lst[DN];
vector<per> q[DN];//st,ind

void ins(int vn,int l,int r,int p,int v) {
  if(l==r) {
    ai[vn]=max(ai[vn],v);
    return;
  }
  int m=(l+r)>>1,fs=(vn<<1);
  if(p<=m) ins(fs,l,m,p,v);
  else ins(fs+1,m+1,r,p,v);
  ai[vn]=max(ai[fs],ai[fs+1]);
}

int qu(int vn,int l,int r,int gl, int gr) {
  if(gl<=l && r<=gr) return ai[vn];
  if(l>=r || gl>r || gr<l) return 0;
  int m=(l+r)>>1,fs=(vn<<1);
  return max(qu(fs,l,m,gl,gr),qu(fs+1,m+1,r,gl,gr));
}

//<parsing>
FILE* fin=fopen("pq.in","r");
const unsigned maxb=30000192;
char buf[maxb];
unsigned ptr=maxb;
 
inline unsigned getInt(){
    unsigned nr=0;
    while(buf[ptr]<'0'||'9'<buf[ptr])
        if(++ptr>=maxb)
            fread(buf,maxb,1,fin),ptr=0;
    while('0'<=buf[ptr]&&buf[ptr]<='9'){
        nr=nr*10+buf[ptr]-'0';
        if(++ptr>=maxb)
            fread(buf,maxb,1,fin),ptr=0;
    }
    return nr;
}
//</parsing>

int main() {
  //ifstream f("input.txt");
  //ifstream f("pq.in");
  ofstream g("pq.out");
  n=getInt(); m=getInt();
  for(int i=1; i<=n; ++i) v[i]=getInt();
  for(int i=0; i<m; ++i) {
    int a,b; a=getInt(); b=getInt();
    q[b].push_back(mp(a,i));
  }
  for(int i=1; i<=n; ++i) {
    if(lst[v[i]]) {
      //cout<<i<<' '<<lst[v[i]]<<'\n';
      ins(1,1,n,lst[v[i]],i-lst[v[i]]);
    }
    lst[v[i]]=i;
    for(auto j:q[i]) rz[j.y]=qu(1,1,n,j.x,i);
  }
  for(int i=0; i<m; ++i) {
    if(rz[i]==0) rz[i]=-1;
    g<<rz[i]<<'\n';
  }
}