Cod sursa(job #2092674)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 22 decembrie 2017 03:01:59
Problema Tricouri Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 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 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){
        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]);
        }
    }
}
int main()
{
    f>>n>>m;
    for(int i=1;i<=n;++i)
        f>>v[i];
    memset(sum,-1,sizeof(sum));
    prec();
    for(int i=1;i<=m;++i)
    {
        f>>Ly>>R; /// I used to
        g<<sum[R][Ly][0]<<'\n';  ///g<<"Rose"<<'\n';
    }
    return 0;
}