Cod sursa(job #2092675)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 22 decembrie 2017 03:09:26
Problema Tricouri Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("tricouri.in");
ofstream g("tricouri.out");
int n,v[300002],m;
int sum[21][6][21],Ly,R,arr[21][21];
bool LoQ[21];
bool vf(int P)
{
    if(P==2 || P==4 || P==8 || P==16)
        return 1;
    return 0;
}
inline void prec()
{
    for(int Qt=2;Qt<=20;++Qt){
        if(!LoQ[Qt])
            continue;
        bool cute=vf(Qt);
        for(int j=0;j<Qt;++j)
            for(int k=0;k<Qt;++k)
                if(cute)
                    arr[j][k]=(j+k)&(Qt-1);
                else
                    arr[j][k]=(j+k)%Qt;
        for(int j=1;j<=n;++j){
            int Rose;
            if(!cute)
                Rose=v[j]%Qt;
            else
                Rose=v[j]&(Qt-1);
            for(int p=4;p>=1;--p)
                for(int k=0;k<Qt;++k)
                    if(sum[Qt][p][k]>0)
                        sum[Qt][p+1][arr[Rose][k]]=max(sum[Qt][p+1][arr[Rose][k]],sum[Qt][p][k]+v[j]);
            sum[Qt][1][Rose]=max(sum[Qt][1][Rose],v[j]);
        }
    }
}
struct qu
{
    int Ly, R;
};
qu vv[102];
int main()
{
    f>>n>>m;
    for(int i=1;i<=n;++i)
        f>>v[i];
    memset(sum,-1,sizeof(sum));
    for(int i=1;i<=m;++i)
    {
        f>>vv[i].Ly>>vv[i].R;
        LoQ[vv[i].R]=1;
    }
    prec();
    for(int i=1;i<=m;++i){
        int Ly=vv[i].Ly;
        int R=vv[i].R;
        g<<sum[R][Ly][0]<<'\n';  ///g<<"Rose"<<'\n';
    }
    return 0;
}