Cod sursa(job #1712266)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 2 iunie 2016 15:56:01
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.48 kb
#include <cstdio>
#include <algorithm>
#define MAXN 100000
#define MAXQ 100000
#define zeros(x) (x&(-x))
int last[MAXN+1],aib[MAXN+1],ans[MAXQ+1];
using namespace std;
struct querry{
    int L,R,poz;
};
struct Punct{
    int x,y;
};
Punct P[MAXN+1];
querry Q[MAXN+1];
bool cmp1(querry a,querry b){
    return a.R<b.R;
}
bool cmp2(Punct a,Punct b){
    return a.y<b.y;
}
inline void update(int poz,int val){
     int i;
     for(i=poz;i>0;i-=zeros(i))
        if(aib[i]<val)
           aib[i]=val;
     if(i==0&&aib[0]<val)
        aib[0]=val;
}
inline int querry(int poz,int n){
    int i,max=0;
    for(i=poz;i<=n;i+=zeros(i))
       if(aib[i]>max)
          max=aib[i];
    return max;
}
int main(){
    FILE*fi,*fout;
    int i,j,n,q,nr;
    fi=fopen("pq.in" ,"r");
    fout=fopen("pq.out" ,"w");
    fscanf(fi,"%d%d" ,&n,&q);
    for(i=1;i<=n;i++){
       fscanf(fi,"%d" ,&nr);
       P[i].x=last[nr];
       P[i].y=i;
       last[nr]=i;
    }
    for(i=1;i<=q;i++){
        fscanf(fi,"%d%d" ,&Q[i].L,&Q[i].R);
        Q[i].poz=i;
    }
    sort(Q+1,Q+q+1,cmp1);
    sort(P+1,P+n+1,cmp2);
    j=1;
    for(i=1;i<=q;i++){
        while(j<=n&&P[j].y<=Q[i].R){
           update(P[j].x,P[j].y-P[j].x);
           j++;
        }
        ans[Q[i].poz]=querry(Q[i].L,n);
        if(ans[Q[i].poz]==0)
           ans[Q[i].poz]=-1;
    }
    for(i=1;i<=q;i++)
       fprintf(fout,"%d\n" ,ans[i]);
    fclose(fi);
    fclose(fout);
    return 0;
}