Pagini recente » Cod sursa (job #992564) | Istoria paginii runda/cei_mai_mari_olimpicari_runda_4/clasament | Cod sursa (job #1469844) | Istoria paginii runda/unu/clasament | Cod sursa (job #2015851)
#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;
}