/*****************************************************************
* Ovo delo zaštićeno je licencom Creative Commons CC BY-NC-ND 4.0
* (Attribution-NonCommercial-NoDerivatives 4.0 International License).
* Za detalje pogledati LICENSE.TXT
* Autori: Milena Vujosevic Janicic, Jovana Kovacevic,  
*         Danijela Simic, Andjelka Zecevic, Aleksandra Kocic
******************************************************************/

#include <stdio.h>
#include <stdlib.h>

#define MAKS 100

/* Funkcija ucitava elemente niza dimenzije n. */
void ucitaj(int niz[], int n) {
  int i;
  printf("Unesite elemente niza: ");
  for (i = 0; i < n; i++)
    scanf("%d", &niz[i]);
}

/* a) */
int podniz_uzastopnih(int a[], int n, int b[], int m) {
  int i, j;

  /* Obilaze se elementi prvog niza. Svaki element prvog niza moze
     biti pocetak podniza, odnosno pocetak drugog niza. */
  for (i = 0; i + m - 1 < n; i++) {
    /* Prolaze se elementi drugog niza. Za svaki element niza b
       proverava se da li je jednak odgovarajucem elementu niza a.
       Za niz a razmatra se da li podniz pocinje od pozicije i.
       Tako 0-ti element niza b je na poziciji i, 1. element je na
       poziciji i+1, 2. na poziciji i+2, ..., j-ti na poziciji i+j.
       Ako uslov nije ispunjen, petlja se prekida i proverava se da
       li na sledecoj poziciji u nizu a pocinje podniz. */
    for (j = 0; j < m; j++)
      if (a[i + j] != b[j])
        break;
    /* Ako petlja nije prekinuta nakon ispitivanja, brojac za niz b 
       je jedanak dimenziji niza b, odnosno svi elementi niza b se
       uzastopno nalaze u nizu a. */
    if (j == m)
      return 1;
  }

  /* Ukoliko niz b jeste uzastopni podniz uslov u petlji ce u nekom 
     trenutku biti ispunjen i iz petlje i funkcije ce se izaci sa
     return naredbom. Ipak, ako se to nije desilo i dalje se
     izvrsava funkcija, onda niz b nije uzastopni podniz. */
  return 0;
}

/* b) */
int podniz(int a[], int n, int b[], int m) {
  int i, j;

  /* Obilaze se elementi niza a. */
  for (i = 0, j = 0; i < n && j < m; i++) {
    /* Svaki put kada se naidje na element niza b, brojac za niz b
       se uvecava i proverava se da li se sledeci element niza b
       nalazi u nizu a. */
    if (a[i] == b[j])
      j++;
  }

  /* Ukoliko se pronadju svi elementi niza b u nizu a, onda je
     brojac za niz b jednak dimenziji niza b. U tom slucaju se
     vraca vrednost 1, odnosno da niz jeste podniz. */
  return j == m;
}

int main() {
  /* Deklaracija potrebnih promenljivih. */
  int n, a[MAKS];
  int m, b[MAKS];

  /* Ucitavanje dimenzije niza i provera ispravnosti ulaza. */
  printf("Unesite dimenziju niza: ");
  scanf("%d", &n);
  if (n <= 0 || n > MAKS) {
    printf("Greska: neispravan unos.\n");
    exit(EXIT_FAILURE);
  }

  /* Ucitavanje elemenata prvog niza. */
  ucitaj(a, n);

  /* Ucitavanje dimenzije niza i provera ispravnosti ulaza. */
  printf("Unesite dimenziju niza: ");
  scanf("%d", &m);
  if (m <= 0 || m > MAKS) {
    printf("Greska: neispravan unos.\n");
    exit(EXIT_FAILURE);
  }

  /* Ucitavanje elemenata drugog niza. */
  ucitaj(b, m);

  /* a) */
  if (podniz_uzastopnih(a, n, b, m))
    printf("Elementi drugog niza cine uzastopni podniz "
           "prvog niza.\n");
  else
    printf("Elementi drugog niza ne cine uzastopni podniz "
           "prvog niza.\n");

  /* b) */
  if (podniz(a, n, b, m))
    printf("Elementi drugog niza cine podniz prvog niza.\n");
  else
    printf("Elementi drugog niza ne cine podniz prvog niza.\n");

  exit(EXIT_SUCCESS);
}