#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
template < class S, class T> inline S min_L( S a,T b) {
return a<= b? a: b;
}
#define main dummy_main
int main( ) {
return 0 ;
}
#undef main
int user;
map< string,int > id;
vector< int > tweet[ 10000 ] ;
int sorted[ 10000 ] ;
class TweetCounts{
public :
TweetCounts( ) {
user = 0 ;
id.clear ( ) ;
}
int getID( string name) {
if ( ! id.count ( name) ) {
tweet[ user] .clear ( ) ;
sorted[ user] = 1 ;
id[ name] = user++ ;
}
return id[ name] ;
}
void recordTweet( string name, int tm ) {
int id = getID( name) ;
tweet[ id] .push_back ( tm ) ;
sorted[ id] = 0 ;
}
vector< int > getTweetCountsPerFrequency( string freq, string name, int st, int et) {
int id = getID( name) ;
int i;
int n;
int delta;
vector< int > res;
et++ ;
if ( sorted[ id] == 0 ) {
sorted[ id] = 1 ;
sort( tweet[ id] .begin ( ) , tweet[ id] .end ( ) ) ;
}
if ( freq == "minute" ) {
delta = 60 ;
}
if ( freq == "hour" ) {
delta = 60 * 60 ;
}
if ( freq == "day" ) {
delta = 60 * 60 * 24 ;
}
i = lower_bound( tweet[ id] .begin ( ) , tweet[ id] .end ( ) , st) - tweet[ id] .begin ( ) ;
while ( st < et) {
n = 0 ;
st = min_L( st+ delta, et) ;
while ( i < tweet[ id] .size ( ) && tweet[ id] [ i] < st) {
i++ ;
n++ ;
}
res.push_back ( n) ;
}
return res;
}
}
;
// cLay varsion 20200214-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// int user;
// map<string,int> id;
// vector<int> tweet[10000];
// int sorted[10000];
//
// class TweetCounts {
// public:
// TweetCounts() {
// user = 0;
// id.clear();
// }
//
// int getID(string name){
// if(!id.count(name)){
// tweet[user].clear();
// sorted[user] = 1;
// id[name] = user++;
// }
// return id[name];
// }
//
// void recordTweet(string name, int tm) {
// int id = getID(name);
// tweet[id].push_back(tm);
// sorted[id] = 0;
// }
//
// vector<int> getTweetCountsPerFrequency(string freq, string name, int st, int et) {
// int id = getID(name);
// int i, n, delta;
// vector<int> res;
// et++;
// if(sorted[id]==0){
// sorted[id] = 1;
// sort(tweet[id].begin(), tweet[id].end());
// }
// if(freq == "minute") delta = 60;
// if(freq == "hour") delta = 60*60;
// if(freq == "day") delta = 60*60*24;
//
// i = lower_bound(tweet[id].begin(), tweet[id].end(), st) - tweet[id].begin();
// while(st < et){
// n = 0;
// st = min(st+delta, et);
// while(i < tweet[id].size() && tweet[id][i] < st) i++, n++;
// res.push_back(n);
// }
//
// return res;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnRlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+IGlubGluZSBTIG1pbl9MKFMgYSxUIGIpewogIHJldHVybiBhPD1iP2E6YjsKfQojZGVmaW5lIG1haW4gZHVtbXlfbWFpbgppbnQgbWFpbigpewogIHJldHVybiAwOwp9CiN1bmRlZiBtYWluCmludCB1c2VyOwptYXA8c3RyaW5nLGludD4gaWQ7CnZlY3RvcjxpbnQ+IHR3ZWV0WzEwMDAwXTsKaW50IHNvcnRlZFsxMDAwMF07CmNsYXNzIFR3ZWV0Q291bnRzewogIHB1YmxpYzoKICBUd2VldENvdW50cygpewogICAgdXNlciA9IDA7CiAgICBpZC5jbGVhcigpOwogIH0KICBpbnQgZ2V0SUQoc3RyaW5nIG5hbWUpewogICAgaWYoIWlkLmNvdW50KG5hbWUpKXsKICAgICAgdHdlZXRbdXNlcl0uY2xlYXIoKTsKICAgICAgc29ydGVkW3VzZXJdID0gMTsKICAgICAgaWRbbmFtZV0gPSB1c2VyKys7CiAgICB9CiAgICByZXR1cm4gaWRbbmFtZV07CiAgfQogIHZvaWQgcmVjb3JkVHdlZXQoc3RyaW5nIG5hbWUsIGludCB0bSl7CiAgICBpbnQgaWQgPSBnZXRJRChuYW1lKTsKICAgIHR3ZWV0W2lkXS5wdXNoX2JhY2sodG0pOwogICAgc29ydGVkW2lkXSA9IDA7CiAgfQogIHZlY3RvcjxpbnQ+IGdldFR3ZWV0Q291bnRzUGVyRnJlcXVlbmN5KHN0cmluZyBmcmVxLCBzdHJpbmcgbmFtZSwgaW50IHN0LCBpbnQgZXQpewogICAgaW50IGlkID0gZ2V0SUQobmFtZSk7CiAgICBpbnQgaTsKICAgIGludCBuOwogICAgaW50IGRlbHRhOwogICAgdmVjdG9yPGludD4gcmVzOwogICAgZXQrKzsKICAgIGlmKHNvcnRlZFtpZF09PTApewogICAgICBzb3J0ZWRbaWRdID0gMTsKICAgICAgc29ydCh0d2VldFtpZF0uYmVnaW4oKSwgdHdlZXRbaWRdLmVuZCgpKTsKICAgIH0KICAgIGlmKGZyZXEgPT0gIm1pbnV0ZSIpewogICAgICBkZWx0YSA9IDYwOwogICAgfQogICAgaWYoZnJlcSA9PSAiaG91ciIpewogICAgICBkZWx0YSA9IDYwKjYwOwogICAgfQogICAgaWYoZnJlcSA9PSAiZGF5Iil7CiAgICAgIGRlbHRhID0gNjAqNjAqMjQ7CiAgICB9CiAgICBpID0gbG93ZXJfYm91bmQodHdlZXRbaWRdLmJlZ2luKCksIHR3ZWV0W2lkXS5lbmQoKSwgc3QpIC0gdHdlZXRbaWRdLmJlZ2luKCk7CiAgICB3aGlsZShzdCA8IGV0KXsKICAgICAgbiA9IDA7CiAgICAgIHN0ID1taW5fTChzdCtkZWx0YSwgZXQpOwogICAgICB3aGlsZShpIDwgdHdlZXRbaWRdLnNpemUoKSAmJiB0d2VldFtpZF1baV0gPCBzdCl7CiAgICAgICAgaSsrOwogICAgICAgIG4rKzsKICAgICAgfQogICAgICByZXMucHVzaF9iYWNrKG4pOwogICAgfQogICAgcmV0dXJuIHJlczsKICB9Cn0KOwovLyBjTGF5IHZhcnNpb24gMjAyMDAyMTQtMQoKLy8gLS0tIG9yaWdpbmFsIGNvZGUgLS0tCi8vICNkZWZpbmUgbWFpbiBkdW1teV9tYWluCi8vIHt9Ci8vICN1bmRlZiBtYWluCi8vIAovLyBpbnQgdXNlcjsKLy8gbWFwPHN0cmluZyxpbnQ+IGlkOwovLyB2ZWN0b3I8aW50PiB0d2VldFsxMDAwMF07Ci8vIGludCBzb3J0ZWRbMTAwMDBdOwovLyAKLy8gY2xhc3MgVHdlZXRDb3VudHMgewovLyBwdWJsaWM6Ci8vICAgVHdlZXRDb3VudHMoKSB7Ci8vICAgICB1c2VyID0gMDsKLy8gICAgIGlkLmNsZWFyKCk7Ci8vICAgfQovLyAKLy8gICBpbnQgZ2V0SUQoc3RyaW5nIG5hbWUpewovLyAgICAgaWYoIWlkLmNvdW50KG5hbWUpKXsKLy8gICAgICAgdHdlZXRbdXNlcl0uY2xlYXIoKTsKLy8gICAgICAgc29ydGVkW3VzZXJdID0gMTsKLy8gICAgICAgaWRbbmFtZV0gPSB1c2VyKys7Ci8vICAgICB9Ci8vICAgICByZXR1cm4gaWRbbmFtZV07Ci8vICAgfQovLyAKLy8gICB2b2lkIHJlY29yZFR3ZWV0KHN0cmluZyBuYW1lLCBpbnQgdG0pIHsKLy8gICAgIGludCBpZCA9IGdldElEKG5hbWUpOwovLyAgICAgdHdlZXRbaWRdLnB1c2hfYmFjayh0bSk7Ci8vICAgICBzb3J0ZWRbaWRdID0gMDsKLy8gICB9Ci8vIAovLyAgIHZlY3RvcjxpbnQ+IGdldFR3ZWV0Q291bnRzUGVyRnJlcXVlbmN5KHN0cmluZyBmcmVxLCBzdHJpbmcgbmFtZSwgaW50IHN0LCBpbnQgZXQpIHsKLy8gICAgIGludCBpZCA9IGdldElEKG5hbWUpOwovLyAgICAgaW50IGksIG4sIGRlbHRhOwovLyAgICAgdmVjdG9yPGludD4gcmVzOwovLyAgICAgZXQrKzsKLy8gICAgIGlmKHNvcnRlZFtpZF09PTApewovLyAgICAgICBzb3J0ZWRbaWRdID0gMTsKLy8gICAgICAgc29ydCh0d2VldFtpZF0uYmVnaW4oKSwgdHdlZXRbaWRdLmVuZCgpKTsKLy8gICAgIH0KLy8gICAgIGlmKGZyZXEgPT0gIm1pbnV0ZSIpIGRlbHRhID0gNjA7Ci8vICAgICBpZihmcmVxID09ICJob3VyIikgZGVsdGEgPSA2MCo2MDsKLy8gICAgIGlmKGZyZXEgPT0gImRheSIpIGRlbHRhID0gNjAqNjAqMjQ7Ci8vIAovLyAgICAgaSA9IGxvd2VyX2JvdW5kKHR3ZWV0W2lkXS5iZWdpbigpLCB0d2VldFtpZF0uZW5kKCksIHN0KSAtIHR3ZWV0W2lkXS5iZWdpbigpOwovLyAgICAgd2hpbGUoc3QgPCBldCl7Ci8vICAgICAgIG4gPSAwOwovLyAgICAgICBzdCA9IG1pbihzdCtkZWx0YSwgZXQpOwovLyAgICAgICB3aGlsZShpIDwgdHdlZXRbaWRdLnNpemUoKSAmJiB0d2VldFtpZF1baV0gPCBzdCkgaSsrLCBuKys7Ci8vICAgICAgIHJlcy5wdXNoX2JhY2sobik7Ci8vICAgICB9Ci8vIAovLyAgICAgcmV0dXJuIHJlczsKLy8gICB9Ci8vIH07Cg==