 # ZCO14001 - Editorial

PROBLEM SETTER -
ZCO 2014

DIFFICULTY -
Beginner

PREREQUISITES -
Implementation

SOLUTION IN SHORT -
There are no techniques or optimizations. Do as directed!!!

EXPLANATION -
There is a while loop which has a condition of breaking to be when input numer is 0. You can maintain a variable i denoting the current position of crane. You also have stored the stack sizes in an array a. For drop command, check if a[i]+1 is greater than h, if not, increment a[i]. For pick command, check if a[i] is positive, if yes, decrement a[i]. For moving left, do i-- and for moving right, do i++ and accordingly check if i > 1 (for moving left) and i < N (for moving right). Outside the while loop, after it has ended, output the array a.

TIME COMPLEXITY -
O(number of queries/operations)

#include
using namespace std;
int main()
{
int n=0,i=0,h=0,a,ch,j=0;
cin>>n;
cin>>h;
for(i=0;i<n;i++)
cin>>a[i];
i=0;
while(ch !=0)
{
cin>>ch;
switch(ch)
{
case 1:
{
if(i>0 && i<=n )
{
i–;ch=-1;
}
}
break;
case 2:
{
if(i>=0&&i<n)
{
i++;ch=-1;
}
}
break;
case 3:
{
if(a[i]>0)
{
a[i]=a[i]-1;ch=-1;
}
}
break;
case 4:
{
if(a[i]<h)
{
a[i]=a[i]+1;ch=-1;
}
}
break;
case 0:
break;
default:
{
ch=-1;
}
break;
}
}
for(i=0;i<n;i++)
{
cout<<a[i];
}
return 0;
}

In Python 3.6:

``````l, lim = [int(i) for i in input().split()]
a = [int(i) for i in  input().split()]
commands = list(input())
s, crane = 1, False
for c in commands:
if c == "1" and s != 1:
s -= 1
elif c == "2" and s != l:
s += 1
elif c == "3" and not crane and a[s-1] != 0:
a[s-1] -= 1
crane = True
elif c == "4" and a[s-1] < lim and crane:
a[s-1] += 1
crane = False
elif c == "0":
break
o = ""
for i in a:
o += " " + str(i)
print(o[1:])``````

C++:

``````#include <bits/stdc++.h>

using namespace std;

int main() {
int widthBox, heightBox;
scanf("%d %d", &widthBox, &heightBox);

int box[widthBox];
for (int i = 0; i < widthBox; i++)
cin >> box[i];

int hookLocation = 0, holding = 0;
int input = 0;
while (cin >> input) {
switch (input) {
case 1:
if (hookLocation > 0)
hookLocation--;
break;
case 2:
if (hookLocation < widthBox - 1)
hookLocation++;
break;
case 3:
if (holding == 0 && box[hookLocation] > 0) {
holding++;
box[hookLocation]--;
}
break;
case 4:
if (holding == 1 && box[hookLocation] < heightBox) {
holding--;
box[hookLocation]++;
}
break;
case 0:
break;
}
}

for (int i = 0; i < widthBox; i++)
printf("%d ", box[i]);

return 0;
}``````

@vivek1_007 what happens when the stack is full? does the lifted box simply vanish?
if so, how is the 1st input example justified:
7 4
3 1 2 1 4 0 1
3 2 2 2 2 4 1 3 1 4 0

the output should have been : 2 1 3 0 4 0 1
instead of : 2 1 3 1 4 0 1

anyone kindly help

IN C++

``````    #include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main(){

// number of stacks (n) and max height for stacks (H)

ll n,h,p=0;
cin>>n>>h;

// array for height of stack

ll a[n];

// array for operation

ll b;

// taking height as input

for(ll i=0;i<n;i++){
cin>>a[i];
}

// taking operations as input

ll jim;
while(cin>>jim){
b[p]=jim;
p++;
if(jim==0){
break;
}
}

// variable to know if box is already present at crane or not
// if box is present then k=1 otherwise 0
// initially there was no box at crane

ll k=0;

// variable to determine crane position
// initially crane was at 0th stack

ll j=0;

//traversing through operation array

for(ll i=0;i<p;i++){

// if operation is 0 then we have to quit

if(b[i]==0){
break;
}

// if operation is 1 we have to move left but we cannot go left if we are already at beginning i.e.. 0 .

else if(b[i]==1){
if(j!=0){
j=j-1;
}
}

// if operation is 2 we have to move right but we cannot go right if we are already at end i.e.. n-1 .

else if(b[i]==2){
if(j!=n-1){
j=j+1;
}
}

// if operation is 3 we have to pick the box that means set k=1 and decrease height of current stack by 1.
// But we can't do it if either there is a box already present at crane or there is no box at current stack.

else if(b[i]==3){
if(k!=1 && a[j]!=0){
k=1;
a[j]=a[j]-1;
}
}
// if operation is 4 we have to drop the box that means set k=0 and increase height of current stack by 1.
// But we can't do it if either there is a no box present at crane or height of current stack is equal to H (max height of each stack).

else{
if(k!=0 && a[j]<h){
k=0;
a[j]=a[j]+1;
}
}
}

// print the final heights of stacks

for(ll i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
``````