#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
#define main dummy_main
int main( ) {
return 0 ;
}
#undef main
class UndergroundSystem{
public :
int sn;
map< string,int > sID;
map< int ,int > p2s;
map< int ,int > p2t;
map< pair< int ,int > ,double > tm ;
map< pair< int ,int > ,double > tot;
UndergroundSystem( ) {
sn = 0 ;
}
int stationID( string stationName) {
if ( sID.count ( stationName) ) {
return sID[ stationName] ;
}
return sID[ stationName] = sn++ ;
}
void checkIn( int id, string stationName, int t) {
p2s[ id] = stationID( stationName) ;
p2t[ id] = t;
}
void checkOut( int id, string stationName, int t) {
int x = p2s[ id] ;
int y = stationID( stationName) ;
tm [ make_pair( x,y) ] + = 1 ;
tot[ make_pair( x,y) ] + = t - p2t[ id] ;
}
double getAverageTime( string startStation, string endStation) {
int x = stationID( startStation) ;
int y = stationID( endStation) ;
return tot[ make_pair( x,y) ] / tm [ make_pair( x,y) ] ;
}
}
;
// cLay varsion 20200325-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// class UndergroundSystem {
// public:
// int sn;
// map<string,int> sID;
// map<int,int> p2s, p2t;
// map<pair<int,int>,double> tm, tot;
//
// UndergroundSystem() {
// sn = 0;
// }
//
// int stationID(string stationName){
// if(sID.count(stationName)) return sID[stationName];
// return sID[stationName] = sn++;
// }
//
// void checkIn(int id, string stationName, int t) {
// p2s[id] = stationID(stationName);
// p2t[id] = t;
// }
//
// void checkOut(int id, string stationName, int t) {
// int x = p2s[id];
// int y = stationID(stationName);
// tm[make_pair(x,y)] += 1;
// tot[make_pair(x,y)] += t - p2t[id];
// }
//
// double getAverageTime(string startStation, string endStation) {
// int x = stationID(startStation);
// int y = stationID(endStation);
// return tot[make_pair(x,y)] / tm[make_pair(x,y)];
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbWFpbiBkdW1teV9tYWluCmludCBtYWluKCl7CiAgcmV0dXJuIDA7Cn0KI3VuZGVmIG1haW4KY2xhc3MgVW5kZXJncm91bmRTeXN0ZW17CiAgcHVibGljOgogIGludCBzbjsKICBtYXA8c3RyaW5nLGludD4gc0lEOwogIG1hcDxpbnQsaW50PiBwMnM7CiAgbWFwPGludCxpbnQ+IHAydDsKICBtYXA8cGFpcjxpbnQsaW50Pixkb3VibGU+IHRtOwogIG1hcDxwYWlyPGludCxpbnQ+LGRvdWJsZT4gdG90OwogIFVuZGVyZ3JvdW5kU3lzdGVtKCl7CiAgICBzbiA9IDA7CiAgfQogIGludCBzdGF0aW9uSUQoc3RyaW5nIHN0YXRpb25OYW1lKXsKICAgIGlmKHNJRC5jb3VudChzdGF0aW9uTmFtZSkpewogICAgICByZXR1cm4gc0lEW3N0YXRpb25OYW1lXTsKICAgIH0KICAgIHJldHVybiBzSURbc3RhdGlvbk5hbWVdID0gc24rKzsKICB9CiAgdm9pZCBjaGVja0luKGludCBpZCwgc3RyaW5nIHN0YXRpb25OYW1lLCBpbnQgdCl7CiAgICBwMnNbaWRdID0gc3RhdGlvbklEKHN0YXRpb25OYW1lKTsKICAgIHAydFtpZF0gPSB0OwogIH0KICB2b2lkIGNoZWNrT3V0KGludCBpZCwgc3RyaW5nIHN0YXRpb25OYW1lLCBpbnQgdCl7CiAgICBpbnQgeCA9IHAyc1tpZF07CiAgICBpbnQgeSA9IHN0YXRpb25JRChzdGF0aW9uTmFtZSk7CiAgICB0bVttYWtlX3BhaXIoeCx5KV0gKz0gMTsKICAgIHRvdFttYWtlX3BhaXIoeCx5KV0gKz0gdCAtIHAydFtpZF07CiAgfQogIGRvdWJsZSBnZXRBdmVyYWdlVGltZShzdHJpbmcgc3RhcnRTdGF0aW9uLCBzdHJpbmcgZW5kU3RhdGlvbil7CiAgICBpbnQgeCA9IHN0YXRpb25JRChzdGFydFN0YXRpb24pOwogICAgaW50IHkgPSBzdGF0aW9uSUQoZW5kU3RhdGlvbik7CiAgICByZXR1cm4gdG90W21ha2VfcGFpcih4LHkpXSAvIHRtW21ha2VfcGFpcih4LHkpXTsKICB9Cn0KOwovLyBjTGF5IHZhcnNpb24gMjAyMDAzMjUtMQoKLy8gLS0tIG9yaWdpbmFsIGNvZGUgLS0tCi8vICNkZWZpbmUgbWFpbiBkdW1teV9tYWluCi8vIHt9Ci8vICN1bmRlZiBtYWluCi8vIAovLyBjbGFzcyBVbmRlcmdyb3VuZFN5c3RlbSB7Ci8vIHB1YmxpYzoKLy8gICBpbnQgc247Ci8vICAgbWFwPHN0cmluZyxpbnQ+IHNJRDsKLy8gICBtYXA8aW50LGludD4gcDJzLCBwMnQ7Ci8vICAgbWFwPHBhaXI8aW50LGludD4sZG91YmxlPiB0bSwgdG90OwovLyAKLy8gICBVbmRlcmdyb3VuZFN5c3RlbSgpIHsKLy8gICAgIHNuID0gMDsKLy8gICB9Ci8vIAovLyAgIGludCBzdGF0aW9uSUQoc3RyaW5nIHN0YXRpb25OYW1lKXsKLy8gICAgIGlmKHNJRC5jb3VudChzdGF0aW9uTmFtZSkpIHJldHVybiBzSURbc3RhdGlvbk5hbWVdOwovLyAgICAgcmV0dXJuIHNJRFtzdGF0aW9uTmFtZV0gPSBzbisrOwovLyAgIH0KLy8gCi8vICAgdm9pZCBjaGVja0luKGludCBpZCwgc3RyaW5nIHN0YXRpb25OYW1lLCBpbnQgdCkgewovLyAgICAgcDJzW2lkXSA9IHN0YXRpb25JRChzdGF0aW9uTmFtZSk7Ci8vICAgICBwMnRbaWRdID0gdDsKLy8gICB9Ci8vIAovLyAgIHZvaWQgY2hlY2tPdXQoaW50IGlkLCBzdHJpbmcgc3RhdGlvbk5hbWUsIGludCB0KSB7Ci8vICAgICBpbnQgeCA9IHAyc1tpZF07Ci8vICAgICBpbnQgeSA9IHN0YXRpb25JRChzdGF0aW9uTmFtZSk7Ci8vICAgICB0bVttYWtlX3BhaXIoeCx5KV0gKz0gMTsKLy8gICAgIHRvdFttYWtlX3BhaXIoeCx5KV0gKz0gdCAtIHAydFtpZF07Ci8vICAgfQovLyAKLy8gICBkb3VibGUgZ2V0QXZlcmFnZVRpbWUoc3RyaW5nIHN0YXJ0U3RhdGlvbiwgc3RyaW5nIGVuZFN0YXRpb24pIHsKLy8gICAgIGludCB4ID0gc3RhdGlvbklEKHN0YXJ0U3RhdGlvbik7Ci8vICAgICBpbnQgeSA9IHN0YXRpb25JRChlbmRTdGF0aW9uKTsKLy8gICAgIHJldHVybiB0b3RbbWFrZV9wYWlyKHgseSldIC8gdG1bbWFrZV9wYWlyKHgseSldOwovLyAgIH0KLy8gfTsK