A registration card number of PAT consists of 4 parts:

  • the 1st letter represents the test level, namely, T for the top level, A for advance and B for basic;

  • the 2nd - 4th digits are the test site number, ranged from 101 to 999;

  • the 5th - 10th digits give the test date, in the form of yymmdd;

  • finally the 11th - 13th digits are the testee's number, ranged from 000 to 999.

Now given a set of registration card numbers and the scores of the card owners, you are supposed to output the various statistics according to the given queries.

Input Specification:

Each input file contains one test case. For each case, the first line gives two positive integers N (≤) and M (≤), the numbers of cards and the queries, respectively.

Then N lines follow, each gives a card number and the owner's score (integer in [), separated by a space.

After the info of testees, there are M lines, each gives a query in the format Type Term, where

  • Type being 1 means to output all the testees on a given level, in non-increasing order of their scores. The corresponding Term will be the letter which specifies the level;

  • Type being 2 means to output the total number of testees together with their total scores in a given site. The corresponding Term will then be the site number;

  • Type being 3 means to output the total number of testees of every site for a given test date. The corresponding Term will then be the date, given in the same format as in the registration card.

Output Specification:

For each query, first print in a line Case #: input, where # is the index of the query case, starting from 1; and input is a copy of the corresponding input query. Then output as requested:

  • for a type 1 query, the output format is the same as in input, that is, CardNumber Score. If there is a tie of the scores, output in increasing alphabetical order of their card numbers (uniqueness of the card numbers is guaranteed);

  • for a type 2 query, output in the format Nt Ns where Nt is the total number of testees and Ns is their total score;

  • for a type 3 query, output in the format Site Nt where Site is the site number and Nt is the total number of testees at Site. The output must be in non-increasing order of Nt's, or in increasing order of site numbers if there is a tie of Nt.

If the result of a query is empty, simply print NA.

Sample Input:

8 4
B123180908127 99
B102180908003 86
A112180318002 98
T107150310127 62
A107180908108 100
T123180908010 78
B112160918035 88
A107180908021 98
1 A
2 107
3 180908
2 999

 

Sample Output:

Case 1: 1 A
A107180908108 100
A107180908021 98
A112180318002 98
Case 2: 2 107
3 260
Case 3: 3 180908
107 2
123 2
102 1
Case 4: 2 999
NA


#include<stdio.h>
#include<algorithm>
#include<vector>
#include<string>
#include<iostream>

using namespace std;

int fuck[1005];
struct Student
{
    int score;
    string id;
};
struct part
{
    int count=1;
    int id;    
};
vector<Student> seq;
bool cmp(Student a,Student b)
{
    if(a.score!=b.score) return a.score>b.score;
    else return a.id<b.id;
    
}
bool cmp1(part a,part b)
{
    if(a.count!=b.count) return a.count>b.count;
    else return a.id<b.id;
}
int main()
{
    int seqnum;
    int cxnum;
    scanf("%d %d",&seqnum,&cxnum);
    for(int i=0;i<seqnum;i++)
    {
        Student temp;
        cin>>temp.id;
        cin>>temp.score;
        seq.push_back(temp);
    }
    for(int i=1;i<=cxnum;i++)
    {
        vector<Student> result;
        int mode;
        string cxid;
        scanf("%d",&mode);
        cin>>cxid;
        if(mode==2)
        {
            int sum=0;
            int count=0;
            for(int j=0;j<seq.size();j++)
            {
                string ttemp;
                for(int t=1;t<4;t++)
                {
                    ttemp.push_back(seq[j].id[t]);
                }
                if(ttemp==cxid) 
                {
                    sum+=seq[j].score;
                    count++;
                }
                
            }
            printf("Case %d: %d ",i,mode);
            cout<<cxid<<endl;
            if(count!=0) printf("%d %d",count,sum);
            else printf("NA");
        }
        if(mode==1)
        {
            vector<Student> result;
            for(int j=0;j<seq.size();j++)
            {
                if(seq[j].id[0]==cxid[0])
                {
                    result.push_back(seq[j]);
                }
            }
            sort(result.begin(),result.end(),cmp);
            printf("Case %d: %d ",i,mode);
            cout<<cxid<<endl;
            if(result.size()!=0)
            {
                for(int j=0;j<result.size();j++)
                {
                    cout<<result[j].id;
                    printf(" %d",result[j].score);
                    if(j!=result.size()-1) printf("\n");
                } 
            }
            else
            {
                printf("NA");
            }
        }
        if(mode==3)
        {
            fill(fuck,fuck+1005,0);
            bool flag=false;
            for(int j=0;j<seq.size();j++)
            {

                int xx=0;
                int tt;
                for(tt=4;tt<10;tt++)
                {
                    if(cxid[xx++]!=seq[j].id[tt]) break;
                }
                if(tt==10)
                {
                    flag=true;
                    char a[10];
                    int acount=0;
                    int fucku;
                    for(int mm=1;mm<4;mm++)
                    {
                        a[acount++]=seq[j].id[mm];
                    }
                    sscanf(a,"%d",&fucku);
                    
                    fuck[fucku]++;        
                }
            }
            printf("Case %d: %d ",i,mode);
            cout<<cxid<<endl;
            if(flag)
            {
                vector<part> aseq;
                for(int y=0;y<1005;y++)
                {
                    if(fuck[y]!=0)
                    {
                        part tpart;
                        tpart.count=fuck[y];
                        tpart.id=y;
                        aseq.push_back(tpart);
                    }
                }
                sort(aseq.begin(),aseq.end(),cmp1);
                for(int t=0;t<aseq.size();t++)
                {
                    printf("%d %d",aseq[t].id,aseq[t].count);
                    if(t!=aseq.size()-1) printf("\n");
                }
                
            }
            else
            {
                printf("NA");
            }

        }
        if(i!=cxnum) printf("\n");
    }
}