OI XIX - okr

// https://szkopul.edu.pl/problemset/problem/h9erYqBkPcC8KtSvLhMzhgjw/site/?key=statement

// Okropny wiersz

#include <bits/stdc++.h>

using namespace std;

#define int long long

constexpr int sizik = 500 * 1001;

#define ar std::array
#define pr std::pair
#define vec std::vector

typedef vec<vec<int>> _kra;

int w[sizik], isNP[sizik];

void Sito() {
    for (int i = 2; i < sizik; i++) {
        if (!isNP[i]) {
            for (int j = 2 * i; j < sizik; j += i) {
                w[j] = i;
                isNP[j] = true;
            }
            w[i] = 1;
        }
    }
}

int hash_pref[sizik], powP[sizik];
constexpr int P = 37, mod = 1000 * 1000 * 1000 + 7;

void solve() {
    int n;
    std::cin >> n;

    std::string s;
    std::cin >> s;

    for (int i = 1; i <= n; i++) {
        hash_pref[i] = (hash_pref[i - 1] + (int)(s[i - 1] - 'a') * powP[i - 1]) % mod;
    }

    int q;
    std::cin >> q;

    for (; q > 0; q--) {
        int l, r;
        std::cin >> l >> r;

        std::multiset<int> m1, m2;

        int ro = r - l + 1;
        int curr_l = ro;

        while (ro != 1) {
            if (w[ro] == 1) {
                m1.insert(ro);
                ro = 1;
            } else {
                m1.insert(w[ro]);
                ro /= w[ro];
            }
        }

        ro = curr_l;

        for (const auto& a : m1) {
            int tmp = curr_l / a;

            if (((powP[l + tmp - 1] * hash_pref[r - tmp] + powP[l - 1] * hash_pref[l + tmp - 1]) % mod) ==
                ((powP[l - 1] * hash_pref[r] + powP[l + tmp - 1] * hash_pref[l - 1]) % mod)) {
                curr_l = tmp;
            } else {
            }
        }

        std::cout << curr_l << '\n';
    }
}

int32_t main() {
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);

    Sito();
    powP[0] = 1;
    for (int i = 1; i < sizik; i++) {
        powP[i] = (powP[i - 1] * P) % mod;
    }

    int t = 1;
    // std::cin >> t;

    for (; t > 0; t--) {
        solve();
    }

    return 0;
}