Cod sursa(job #1710167)

Utilizator DjokValeriu Motroi Djok Data 28 mai 2016 16:56:43
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.62 kb
#include<bits/stdc++.h>
using namespace std;

typedef struct lol {
    int x,y,id;

    friend bool operator < (const lol &a,const lol &b) {
        if(a.x==b.x) return a.y<b.y;
        return a.x<b.x;
    }

}troll;

int i,j,n,m,x,y,a[100005],R[100005],L[100005],last[100005],rs,ans[100005],arb[400005];
troll q[100005];

void update(int left,int right,int nod) {
    if(left==right) arb[nod]=y;
    else {
           int pivot=(left+right)/2;
           if(x<=pivot) update(left,pivot,2*nod);
           else update(pivot+1,right,2*nod+1);
           arb[nod]=max(arb[2*nod],arb[2*nod+1]);
         }
}

void query(int left,int right,int nod) {
    if(x<=left && right<=y) rs=max(rs,arb[nod]);
    else {
           int pivot=(left+right)/2;
           if(x<=pivot) query(left,pivot,2*nod);
           if(y>pivot) query(pivot+1,right,2*nod+1);
         }
}

int main()
{
  ifstream cin("pq.in");
  ofstream cout("pq.out");

  ios_base::sync_with_stdio(0); cin.tie(0);

  cin>>n>>m;
  for(i=1;i<=n;++i) cin>>a[i],++a[i];
  for(i=1;i<=m;++i) cin>>q[i].x>>q[i].y,q[i].id=i;

  sort(q+1,q+m+1);

  for(i=1;i<=n;++i)
  {
    if(last[a[i]]) L[i]=last[a[i]];
    x=i; y=(!L[i]) ? -1:i-L[i]; update(1,n,1);
    last[a[i]]=i;
  }

  memset(last,0,sizeof(last));

  for(i=n;i;--i)
  {
    if(last[a[i]]) R[i]=last[a[i]];
    last[a[i]]=i;
  }

  for(i=j=1;i<=m;++i)
  {
    while(j<q[i].x) 
    {
      x=R[j]; y=-1;
      if(R[j]) update(1,n,1);
      ++j;
    }

    rs=-1; x=q[i].x; y=q[i].y; query(1,n,1); ans[q[i].id]=rs;
  }

  for(i=1;i<=m;++i) cout<<ans[i]<<'\n';

 return 0;
}