Cod sursa(job #1709184)

Utilizator cojocarugabiReality cojocarugabi Data 28 mai 2016 11:11:38
Problema Pq Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 2.45 kb
# include <bits/stdc++.h>
using namespace std;
# define fi cin
# define fo cout
# define x first
# define y second
# define ll long long
# define db long double
# define scn(x) scanf("%I64d",&x)
# define scan(x) scanf("%d",&x)
# define print(x) printf("%d ",x)
# define prnt(x) printf("%I64d ",x);
# define eol printf("\n")
# define IOS ios_base :: sync_with_stdio(0)
# define pe "Possible"
# define ie "Impossible"
# define halt(...) {fo << (__VA_ARGS__) << '\n';exit(0);}
# define rep(n) for (int qwerty = 1;qwerty <= n;++qwerty)
# define pp(n) cerr << #n << " = " << n << '\n'
# define ppp(v) for (auto it : v) cerr << it << ' ';cerr << '\n'
# define pii pair < int , int >
const int mod = 1e9 + 7;
int s[1 << 20];
int ans[1 << 20];
vector < pair < int , int > > Q[1 << 20];
int Left[1 << 20];
int Right[1 << 20];
int cnt[1 << 20];
int v[1 << 20];
void build(int p,int u,int node)
{
    if (p == u) v[node] = (!Left[p] ? 0 : p - Left[p]);
    else
    {
        int m = (p + u) / 2;
        build(p,m,node << 1);
        build(m+1,u,node << 1 | 1);
        v[node] = max(v[node << 1],v[node << 1 | 1]);
    }
}
void update(int p,int u,int pos,int val,int node)
{
    if (p == u) v[node] = val;
    else
    {
        int m = (p + u) / 2;
        if (pos <= m) update(p,m,pos,val,node << 1);
        else update(m+1,u,pos,val,node << 1 | 1);
        v[node] = max(v[node << 1],v[node << 1 | 1]);
    }
}
int query(int p,int u,int l,int r,int node)
{
    if (l <= p && u <= r) return v[node];
    int ans = 0,m = (p + u) / 2;
    if (l <= m) ans = max(ans,query(p,m,l,r,node << 1));
    if (m+1<=r) ans = max(ans,query(m+1,u,l,r,node << 1 | 1));
    return ans;
}
int main(void)
{
    ifstream fi("pq.in");
    ofstream fo("pq.out");
    int n,m;
    IOS;
    fi>>n>>m;
    for (int i = 1;i <= n;++i) fi>>s[i],++s[i];
    for (int i = 1;i <= m;++i)
    {
        int l,r;
        fi>>l>>r;
        Q[l].push_back({r,i});
    }
    for (int i = 1;i <= n;++i)
    {
        Left[i] = cnt[s[i]];
        cnt[s[i]] = i;
    }
    memset(cnt,0,sizeof(cnt));
    for (int i = n;i;--i)
    {
        Right[i] = cnt[s[i]];
        cnt[s[i]] = i;
    }
    build(1,n,1);
    for (int i = 1;i <= n;++i)
    {
        for (auto it : Q[i])
            ans[it.y] = query(1,n,i,it.x,1);
        if (Right[i]) update(1,n,Right[i],0,1);
    }
    for (int i = 1;i <= m;++i) fo << (!ans[i] ? -1 : ans[i]) << '\n';
    return 0;
}