Cod sursa(job #1842633)

Utilizator giotoPopescu Ioan gioto Data 7 ianuarie 2017 13:09:37
Problema NextSeq Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <cstdio>
#include <algorithm>
#define MOD 100000000
using namespace std;

int n, m, p, a[10001], x[10001], y[10001], st[10001], st2[10001];
inline bool existasir(){
    if(m != p) return 1;
    for(int i = 1; i <= m ; ++i)
        if(st[i] != st2[i]) return 1;
    return 0;
}
inline void adauga(){
    int i = m;
    ++st[i];
    while(st[i] > n && i > 0){
        st[i] = 1;
        --i;
        ++st[i];
    }
    if(i == 0) st[++m] = 1;
}
int main()
{
    freopen("nextseq.in", "r", stdin);
    freopen("nextseq.out", "w", stdout);
    scanf("%d%d%d", &n, &m, &p);
    for(int i = 1; i <= n ; ++i)
        scanf("%d", &a[i]);
    for(int i = 1; i <= m ; ++i)
        scanf("%d", &x[i]);
    for(int i = 1; i <= p ; ++i)
        scanf("%d", &y[i]);
    sort(a + 1, a + n + 1);
    int k = 1;
    while(k <= m){
        int p = 1, dr = n;
        while(p <= dr){
            int mij = (p + dr) / 2;
            if(a[mij] > x[k]) dr = mij - 1;
            else if(a[mij] < x[k]) p = mij + 1;
            else {st[k] = mij; break;}
        }
        ++k;
    }
    k = 1;
    while(k <= p){
        int st = 1, dr = n;
        while(st <= dr){
            int mij = (st + dr) / 2;
            if(a[mij] > y[k]) dr = mij - 1;
            else if(a[mij] < y[k]) st = mij + 1;
            else {st2[k] = mij; break;}
        }
        ++k;
    }
    int sol = 0;
    while(existasir()){
        ++sol;
        adauga();
    }
    printf("%d", sol - 1);
    return 0;
}