Cod sursa(job #1709171)

Utilizator TeamFIIBUAIC NoReturnValue TeamFIIB Data 28 mai 2016 11:09:16
Problema Pq Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.69 kb
#include<fstream>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

typedef struct {
   int x,y,idx;
} qry;

int lft[100005], rght[100005], aint[400005];
int i,j,n,m;
int a[100005],sol[100005],last[100005];
qry q[100005];

bool cmp(qry a, qry b) {
	
	return a.x<b.x;
	
}

void update(int nod, int l, int r, int poz, int val) {
	
	if (l==r) aint[nod]=val;
	else {
	  int mid=(l+r)/2;
		
	  if (poz<=mid) update(2*nod,l,mid,poz,val);
	  else update(2*nod+1,mid+1,r,poz,val);
	  
	  aint[nod]=max(aint[2*nod], aint[2*nod+1]);
		
	}
	
}

int query(int nod, int l ,int r, int x, int y) {
	
	if (l>=x && r<=y) return aint[nod];
	else {
		
		int mid=(l+r)/2;
		
		int vl=0, vr=0;
		
		if (x<=mid) vl=query(2*nod,l,mid,x,y);
		if (y>mid) vr=query(2*nod+1,mid+1,r,x,y);
		
		return max(vl,vr);
		
	}
	
	
}

int main(void) {
	
	ifstream cin("pq.in");
	ofstream cout("pq.out");
	
	cin>>n>>m;
	
	for (i=1; i<=n; ++i) cin>>a[i];
	
	for (i=1; i<=m; ++i) {
		cin>>q[i].x>>q[i].y;
		q[i].idx=i;
	}
	
	//
	for (i=1; i<=n; ++i) {
		
		if (last[a[i]]==0) last[a[i]]=i;
		
		lft[i]=last[a[i]];
		last[a[i]]=i;
		
	}
	
	memset(last,0,sizeof(last));
	
 	for (i=n; i>=1; --i) {

		if (last[a[i]]==0) last[a[i]]=i;
		rght[i]=last[a[i]];
		last[a[i]]=i;

	}
	//
	
	sort(q+1,q+m+1,cmp);
	
	//
	
	for (i=1; i<=n; ++i) update(1,1,n,i,i-lft[i]);
	
	//
	int j=1;
	
	for (i=1; i<=n && j<=m; ++i){
		
		while (q[j].x==i&&j<=m) {
			sol[q[j].idx]=query(1,1,n,q[j].x,q[j].y);
			++j;
		}
		
		update(1,1,n,rght[i],0);
		
	}
	
	for (i=1; i<=m; ++i) {
		if (sol[i]==0) sol[i]=-1;
		cout<<sol[i]<<"\n";
	}
	
	
	return 0;
}