Pagini recente » Cod sursa (job #1568132) | Cod sursa (job #1192667) | Cod sursa (job #438303) | Cod sursa (job #1070287) | Cod sursa (job #1709600)
#include <fstream>
#include <set>
#include <algorithm>
using namespace std;
struct Interval
{
int x, y;
};
struct El
{
int a, i;
};
bool comp(Interval A, Interval B)
{
return A.y-A.x>B.y-B.x;
}
El vec[100001];
int n, i, a, x, y, q, maxim;
Interval interv[1000001];
bool cmp(El a, El b)
{
if(a.a==b.a)
return a.i<b.i;
return a.a<b.a;
}
int main()
{
ifstream f("pq.in");
ofstream g("pq.out");
f>>n>>q;
for(i=1; i<=n; i++)
{
f>>a;
El A;
A.a=a;
A.i=i;
vec[i]=A;
}
int nr=0;
sort(vec+1, vec+n+1, cmp);
for(i=1; i<=n; i++)
{
if(vec[i].a==vec[i+1].a)
{
Interval A;
A.x=vec[i].i;
A.y=vec[i+1].i;
//st.insert(A);
nr++;
interv[nr]=A;
}
}
sort(interv+1, interv+nr+1, comp);
//f>>q;
for(i=1; i<=q; i++)
{
f>>x>>y;
Interval B;
B.x=x;
B.y=y;
int st=1;
int dr=nr;
maxim=-1;
for(int j=1; j<=nr; j++)
{
if(interv[j].x>=x && interv[j].y<=y)
{
maxim=interv[j].y-interv[j].x;
break;
}
}
g<<maxim<<"\n";
/*while(st<=dr)
{
int mid=(st+dr)/2;
if(interv[mid].x>=x && interv[mid].y<=y)
{
if(interv[mid].y-interv[mid].x>maxim)
maxim=interv[mid].y-interv[mid].x;
dr=mid-1;
}
else if(interv[mid].x<x)
st=mid+1;
else if(interv[mid].y>y)
dr=mid-1;
}
g<<maxim<<"\n";*/
}
}