Cod sursa(job #2015851)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 27 august 2017 19:57:22
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.55 kb
#include<fstream>
using namespace std;
ifstream in("caps.in");
ofstream out("caps.out");
char s[100001];
long long k,q,solution,rez,siruri1,siruri2;
long long a,p;
char divide_et_impera( long long x , long long y, long long val, int caps ){
    if( y-x+1 == k ){
        if( caps%2 == 0 ){
            int hz = 0,ak = 0;;
            for( int i = 1; i <= k; i ++ ){
                if( s[i] == s[val-x+1] ){
                    hz++;
                }
                if( i == val-x+1 ){
                    ak = hz;
                }
            }
            solution = siruri1*hz + ak;
            return s[val-x+1];
        }
        else{
            char it;
            if( s[val-x+1] >= 97 ){
                 it = s[val-x+1] - 32;
            }
            else{
                 it = s[val-x+1] + 32;
            }
            int hz = 0,ak = 0;;
            for( int i = 1; i <= k; i ++ ){
                if( s[i] == s[val-x+1] ){
                    hz++;
                }
                if( i == val-x+1 ){
                    ak = hz;
                }
            }
            solution = siruri2*hz + ak;
            return it;
        }
    }
    if( val >= x && val <= x + (y-x+1)/4-1 ){
        return divide_et_impera( x, x + (y-x+1)/4-1,val,caps );
    }
    if( val >= x + (y-x+1)/4  && val <= x + (y-x+1)/2-1 ){
        if( y-x+1 > k*4 ){
        siruri1 += (( y-x+1 )/8)/k;
        siruri2 += (( y-x+1 )/8)/k;}
        else{
            siruri1++;
        }
        return divide_et_impera( x + (y-x+1)/4 ,x + (y-x+1)/2-1,val,caps+1 );
    }
    if( val >= x + (y-x+1)/2 && val <= x + (y-x+1)/4*3-1 ){
        if( y-x+1 > k*4 ){
        siruri1 += (( y-x+1 )/4)/k;
        siruri2 += (( y-x+1 )/4)/k;}
        else{
            siruri1++;
            siruri2++;
        }
        return divide_et_impera( x + (y-x+1)/2, x + (y-x+1)/4*3-1,val,caps+1 );
    }
    if( val >= x + (y-x+1)/4*3  && val <= y ){
        if( y-x+1 > k*4 ){
        siruri1 += (( y-x+1 )/8*3)/k;
        siruri2 += (( y-x+1 )/8*3)/k;}
        else{
            siruri1+=2;
            siruri2++;
        }
        return divide_et_impera( x + (y-x+1)/4*3 , y, val, caps );
    }
}
long long val;
int main(){
    in >> k >> q;
    in >> s+1;
    for( int i = 1; i <= q; i ++ ){
        in >> val;
        p = k;
        while( p < val ){
            p*=4;
        }
        siruri1 = 0;
        siruri2 = 0;
        char rez = divide_et_impera( 1,p,val,0 );
        out<<rez<<" "<< solution<<"\n";
    }
    return 0;
}