#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#include<map>
#include<queue>
#include<iostream>
#include <unistd.h>
/*

Name : Mohamad Hassan N C

Roll No : 111801026

*/

using namespace std;

class packet
{
    public:
    int id;
    float trans;
    int length;
    packet(int ids , float tran , int len)
    {
        id=ids;
        trans=tran;
        length=len;
    }
};
// void printl(list<packet> const &list)
// {
//     for (auto const &i: list) {
//         cout << i.id <<" ";
//     }
// }
int smallest(int turn1 ,int turn2,int queturn,int quesz)
{
    int count1,count2;
    count1=0;
    count2=0;
    while(queturn!=turn1)
    {
        turn1=(turn1+1)%quesz;
        count1+=1;
    }
    while(queturn!=turn2)
    {
        turn2=(turn2+1)%quesz;
        count2+=1;
    }
    if(count1<count2)
    {
        return turn1;
    }
    else
    {
        return turn2;
    }

}
int main(int argc, char * argv[])
{
	/* code */
    FILE * fp;

	int id,length,bucket_cap,remain, bucket_init,queue_id,flag,turn,flagl;

	float trantime,rate,token,timer,time;

    char * filename;

	rate = 4.0;// first argument

	// rate = atof(argv[2]); //second argument

    // filename = argv[4];

    // printf("%f\n",rate);
    // printf("%d\n",bucket_cap);
    // printf("%s\n",filename);

	// fp = fopen(argv[4], "r");
 //    if (fp == NULL)
 //        return -1;
    flagl=0;
    queue<float> pt;
    queue<int> pid;
    queue<int> pqid;
    queue<int> plen;
    bucket_init = bucket_cap ; // initially bucket is filled

    timer=0.0; // initial timer value

    map <int,queue <packet> > mymap;

    time=0.0;
    turn=-1;
    while (scanf("%f\t%d\t%d\t%d\n",&trantime,&id,&queue_id,&length)!=EOF) {

        pt.push(trantime);
        pid.push(id);
        pqid.push(queue_id);
        plen.push(length);

    }
    while (!pt.empty() && !pid.empty() && !pqid.empty() && !plen.empty()) { // reading the input line by line

        id= pid.front();
        trantime = pt.front();
        length = plen.front();
        queue_id = pqid.front();
        pid.pop();
        pt.pop();
        plen.pop();
        pqid.pop();
        packet p1 = packet(id,trantime,length);

        // printf("%f\t%d\t%d\n",trantime,id,length );
        flag=1;

        // cout<<"Map size : "<<mymap.size()<<endl;


        if(p1.trans<=time || mymap.size()==0)
        {
            //     if(queue_id>mymap.size())
            // {
            //     cout<<"1 . add in id :"<<p1.id<<"in queue_id : "<<queue_id-1<<endl;
            //     queue <packet> newlist = {};
            //     // list <int> packets ={id,trantime,length};

            //     newlist.push(p1);

            //     mymap.insert({queue_id-1,newlist});

            //     cout<<"current queue top of queue_id "<< queue_id-1 <<" is "<<mymap[queue_id-1].front().id<<" size is " << mymap[queue_id-1].size()<<endl;

            // }
           
            // else
            // {
            //     cout<<"2 . add in id :"<<p1.id<<"in queue_id : "<<queue_id-1<<endl;
            //     // list <int> packets ={id,trantime,length};
            //     mymap[queue_id-1].push(p1);

            // }
            // while(p1.trans==pt.front() && !(pt.empty()))
            // {
            //         mymap[pqid.front()-1].push(packet(pid.front() , pt.front() , plen.front()));
            //         pid.pop();
            //         pt.pop();
            //         plen.pop();
            //         pqid.pop();
            // }
            mymap[queue_id-1].push(p1);

              // cout<<"current queue top of queue_id "<< queue_id-1 <<" is  "<<mymap[queue_id-1].front().id<<" size is " << mymap[queue_id-1].size()<<endl;
            // printf("adding for id  : %d\n",p1.id);
        }
        else
        {
             // printf("dropping for id : %d\n",p1.id);
             while(p1.trans>=time && flag)
            {
                flag=0;

                turn = (turn+1)%(mymap.size());

                // if(!(pt.empty()))
                // {
                //     printf("1st : %d with id : %d\n",pqid.front(),pid.front());
                //     printf("2nd : %d  with id : %d\n",queue_id,id);
                //     printf("turn : %d \n",turn);
                //     printf("smallest values is  %d \n",smallest( pqid.front(),queue_id,turn,mymap.size()) );
                //     if(smallest( pqid.front()-1,queue_id-1,turn,mymap.size())==pqid.front() && pt.front()==trantime)
                //     {
                //         // turn = (turn+1)%(mymap.size());
                //         printf("breaking\n");
                //         break;
                //     }
                // }



                // printf("turn is %d\n",turn);
                // printf("%d %d %d\n",turn,pqid.front()-1,flagl);
                    if(turn==queue_id-1 && flagl==1 )
                    {

                        turn-=1;
                        break;
                    }   

                if( !(mymap[turn].empty()) )
                {
                    packet p = mymap[turn].front();

                    // printf("packet : %d is dropped\n",p.id); 

                    mymap[turn].pop();

                    // cout<<"current queue top of queue_id "<< turn <<" is "<<mymap[turn].front().id<<endl;

                    if(time<p.trans)
                    {
                        time=p.trans;
                    }
                    // cout<<"add "<<(float)(p.length/rate) <<" to "<<time<<endl;
                    time+=(float)(p.length/rate);

                    // printf("poping\n");

                    printf("%.2f %d\n",time,p.id);

                     // cout<<turn<<endl;

                }


                // printf("turn is %d\n",turn);

                for(int i=0;i<mymap.size();++i)
                    {
                        if(!(mymap[i].empty()))
                        {
                            flag=1;
                            break;
                        }
                    }
                // if(flag==0)
                // {
                //     time=p1.trans;
                // }
            }

            //   if(queue_id>mymap.size())
            // {
            //     queue <packet> newlist = {};

            //     // list <int> packets ={id,trantime,length};
            //     cout<<"3 .add in id :"<<p1.id<<" in queue_id : "<<queue_id-1<<endl;
            //     newlist.push(p1);

            //     mymap.insert({queue_id-1,newlist});

                // cout<<"current queue top of queue_id " << queue_id-1 <<" is "<<mymap[queue_id-1].front().id<<" size is " << mymap[queue_id-1].size()<<endl;

            // }
           
            // else
            // {
            //     cout<<"4 .add in id :"<<p1.id<<" in queue_id : "<<queue_id-1<<endl;
            //     // list <int> packets ={id,trantime,length};
            //     mymap[queue_id-1].push(p1);

            //     cout<<"current queue top of queue_id "<< queue_id-1 <<" is "<<mymap[queue_id-1].front().id<<" size is " << mymap[queue_id-1].size()<<endl;
            // }
            if(p1.trans==pt.front())
                flagl=1;
            else 
                flagl=0;
            // while(p1.trans==pt.front() && !(pt.empty()))
            // {
            //         // printf("%d and %d has same\n",pid.front(),p1.id);
            //         mymap[pqid.front()-1].push(packet(pid.front() , pt.front() , plen.front()));
            //         pid.pop();
            //         pt.pop();
            //         plen.pop();
            //         pqid.pop();
            // }
            mymap[queue_id-1].push(p1);

        }
        // sleep(1);
        // printf("\n");
        // printf("queue status ............. at id : %d\n and time : %.2f ",p1.id,time);
        // for(int i=0 ;i < mymap.size();++i)
        // {
        //     printf("%ld ",mymap[i].size());
        // }
        //  printf("\n");


    }

    flag=1;
    while(flag==1)
    {
        flag=0;

        turn = (turn+1)%(mymap.size());
        if(!(mymap[turn].empty()))
        {
            packet p = mymap[turn].front();

            mymap[turn].pop();

            if(time<p.trans)
            {
                time=p.trans;
            }

            time+=(float)(p.length/rate);

            printf("%.2f %d\n",time,p.id);

        }


        for(int i=0;i<mymap.size();++i)
        {
            if(!(mymap[i].empty()))
            {
                flag=1;
                break;
            }
        }



    }

	return 0;
} 

C++ Online Compiler

Write, Run & Share C++ code online using OneCompiler's C++ online compiler for free. It's one of the robust, feature-rich online compilers for C++ language, running on the latest version 17. Getting started with the OneCompiler's C++ compiler is simple and pretty fast. The editor shows sample boilerplate code when you choose language as C++ and start coding!

Read inputs from stdin

OneCompiler's C++ online compiler supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample program which takes name as input and print your name with hello.

#include <iostream>
#include <string>
using namespace std;

int main() 
{
    string name;
    cout << "Enter name:";
    getline (cin, name);
    cout << "Hello " << name;
    return 0;
}

About C++

C++ is a widely used middle-level programming language.

  • Supports different platforms like Windows, various Linux flavours, MacOS etc
  • C++ supports OOPS concepts like Inheritance, Polymorphism, Encapsulation and Abstraction.
  • Case-sensitive
  • C++ is a compiler based language
  • C++ supports structured programming language
  • C++ provides alot of inbuilt functions and also supports dynamic memory allocation.
  • Like C, C++ also allows you to play with memory using Pointers.

Syntax help

Loops

1. If-Else:

When ever you want to perform a set of operations based on a condition If-Else is used.

if(conditional-expression) {
   //code
}
else {
   //code
}

You can also use if-else for nested Ifs and If-Else-If ladder when multiple conditions are to be performed on a single variable.

2. Switch:

Switch is an alternative to If-Else-If ladder.

switch(conditional-expression){    
case value1:    
 // code    
 break;  // optional  
case value2:    
 // code    
 break;  // optional  
......    
    
default:     
 code to be executed when all the above cases are not matched;    
} 

3. For:

For loop is used to iterate a set of statements based on a condition.

for(Initialization; Condition; Increment/decrement){  
  //code  
} 

4. While:

While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.

while (condition) {  
// code 
}  

5. Do-While:

Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.

do {  
 // code 
} while (condition); 

Functions

Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increases re-usuability and modularity. Function gets run only when it is called.

How to declare a Function:

return_type function_name(parameters);

How to call a Function:

function_name (parameters)

How to define a Function:

return_type function_name(parameters) {  
 // code
}