Pagini recente » Cod sursa (job #1212923) | Cod sursa (job #1581191) | Cod sursa (job #1629586) | Cod sursa (job #2843102) | Cod sursa (job #1709954)
#include <stdio.h>
#include <stdlib.h>
int n, q, i,x, nr,j,k, l,r,m;
int *v[100000];
int a[100000];
int bin(int k, int key){
int m,p,u;
p=1;
u = v[k][0];
while (p < u) {
m = (p + u) / 2;
if (v[k][m] < key)
p = m + 1;
else
u = m;
}
m = (p + u) / 2;
if (v[k][m] < key)
++ m;
return m;
}
int main()
{
freopen("pq.in", "r", stdin);
freopen("pq.out", "w", stdout);
scanf("%d %d", &n, &q);
for(i = 0; i<n; i++)
{
scanf("%d", &x);
if(a[x]==0)
{
nr++;
v[nr] = (int*)(malloc(sizeof(int)*12));
v[nr][0] = 1;
v[nr][1] = i+1;
a[x] = nr;
}
else
{
if(v[a[x]][0]%10==0)
v[a[x]] = realloc(v[a[x]], sizeof(int)*(v[a[x]][0]+11));
v[a[x]][0]++;
v[a[x]][v[a[x]][0]] = i+1;
}
}
for(k=0; k<q; k++)
{
scanf("%d %d", &l, &r);
m = -1;
for(i=1; i<=nr; i++)
{
for(j=/*1*/bin(i, l); j<=v[i][0]; j++)
{
if(v[i][j]<l) continue;
if(v[i][j]>=r) break;
if(j<v[i][0] && v[i][j+1]<=r && v[i][j+1]-v[i][j]>m)
m = v[i][j+1]-v[i][j];
}
if(m==r-l) break;
}
printf("%d\n", m);
}
//afis
/*for(i=1; i<=nr; i++)
{
for(j=1; j<=v[i][0]; j++)
printf("%d ",v[i][j]);
printf("\n");
}*/
return 0;
}