Cod sursa(job #3237820)

Utilizator Chris_BlackBlaga Cristian Chris_Black Data 13 iulie 2024 14:28:52
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.47 kb
#include <bits/stdc++.h>
#define pii pair<int, int>
#define ff first
#define ss second
#define FOR(i, a, b) for(int i = a; i <= b; ++i)
#define FORR(i, a, b) for(int i = a; i >= b; --i)
#define vi vector<int>
#define vvi vector<vi>
#define vvvi vector<vvi>
#define pb push_back
#define ll long long

using namespace std;
const string TASK("nondec");
ifstream fin(TASK + ".in");
ofstream fout(TASK + ".out");
#define cin fin
#define cout fout

const int N = 50009, K = 21, Q = 2e5 + 9, Mod = 1e9 + 7;

int n, k, q, a[N], ql[Q], qr[Q], ans[Q];
int dp[N][K], cnt[K][K];

void divide(int l, int r, vector<int>& ids)
{
    if(l == r)
    {
        for(auto i : ids)ans[i] = 1;
        return;
    }

    int m = (l + r) >> 1;
    vector<int> st, dr, mj;
    for(auto i : ids)
    {
        if(qr[i] <= m)st.pb(i);
        else if(ql[i] > m)dr.pb(i);
        else mj.pb(i);
    }

    divide(l, m, st);
    divide(m + 1, r, dr);

    if(mj.empty())return;

    FOR(i, l, r)FOR(j, 1, k)dp[i][j] = 0;
    FOR(i, 1, k)FOR(j, 1, k)cnt[i][j] = 0;

    FORR(i, m, l)
    {
        FOR(j, a[i], k)
            FOR(l, j, k)
                cnt[a[i]][l] = (cnt[a[i]][l] + cnt[j][l]) % Mod;
        cnt[a[i]][a[i]] = (cnt[a[i]][a[i]] + 1) % Mod;

        FOR(j, 1, k)
            FOR(l, j, k)
                dp[i][l] = (dp[i][l] + cnt[j][l]) % Mod;
    }

    FOR(i, 1, k)FOR(j, 1, k)cnt[i][j] = 0;

    FOR(i, m + 1, r)
    {
        FOR(j, 1, a[i])
            FORR(l, a[i], j)
                cnt[j][a[i]] = (cnt[j][a[i]] + cnt[j][l]) % Mod;
        cnt[a[i]][a[i]] = (cnt[a[i]][a[i]] + 1) % Mod;

        FOR(j, 1, k)
            FOR(l, j, k)
                dp[i][j] = (dp[i][j] + cnt[j][l]) % Mod;
    }

//    cout << l << ' ' << m << ' ' << r << '\n';
    for(auto i : mj)
    {
//        cout << "Answering " << i << '\n';
        FOR(j, 1, k)
        {
//            cout << j << "  " << dp[ql[i]][j] << ' ' << dp[qr[i]][j] << '\n';
            ans[i] = ((ans[i] + dp[ql[i]][j]) % Mod + dp[qr[i]][j]) % Mod;
            FOR(l, j, k)
                ans[i] = (ans[i] + 1LL * dp[ql[i]][j] * dp[qr[i]][l] % Mod) % Mod;
        }
    }

//    cout << "\n";
}

int main()
{
    cin >> n >> k;
    FOR(i, 1, n)cin >> a[i];

    cin >> q;

    vector<int> qids;
    FOR(i, 1, q)
    {
        cin >> ql[i] >> qr[i];
        qids.pb(i);
    }

    divide(1, n, qids);

    FOR(i, 1, q)cout << (ans[i] + 1) % Mod << '\n';
    return 0;
}