Pagini recente » Cod sursa (job #1404889) | Cod sursa (job #1090140) | Cod sursa (job #607064) | Cod sursa (job #2682574) | Cod sursa (job #71289)
Cod sursa(job #71289)
using namespace std;
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <ctime>
#define maxn 100001
#define maxlog 20
int dp[maxlog][maxn];
int a[maxn], n;
template<class T> inline T maxim(T a, T b)
{
if(a<b) return b;
return a;
}
void citire()
{
freopen("rmq.in","r",stdin);
scanf("%d\n", &n);
for(int i=0;i<n;++i)scanf("%d ", a+i);
}
void init()
{
int i, j,cnt;
for(i=1;i<=n;++i)dp[0][i]=a[i];
for(i=1;(1<<i) <=n ;++i )
for(j=1;j+(1<<i)-1<=n;++j)
// dp[i][j]=max(dp[i-1][j], dp[i-1][j+(1<<(i-1))]);
dp[i][j]=dp[i-1][j]>?dp[i-1][j+(1<<(i-1))];
}
int query(int i, int j)
{
int k;//k=(int)log2(j-i);
int v=j-i;
for(k=1 ; (1<<k) < v; ++k);
if((1<<k)>v)--k;
return (dp[k][i]>?dp[k][j-(1<<k)]);
// return max(dp[k][i], dp[k][j-(1<<k)]);
}
int maxval(int i, int j)
{
int max=-1;//0x3f3f3f3f;
for(int k=i;k<=j;++k)if(max<a[k]) max=a[k];
return max;
}
int sum(int a, int b)
{
return a+b;
}
int main()
{
// citire();
n=100000;
srand(time(0));
for(int i=1;i<=n;++i) a[i]=(rand()%100000000);
init();
// process2();
int nr=0;
for(int i=1;i<1000;++i)
for(int j=i;j<=1000;++j)
{
// printf("%d %d ((%d :: %d )) \n", i, j, query(i, j), maxval(i, j));
query(i, j);
//if(query(i, j)!=maxval(i, j))++nr;
}
printf("%d\n", nr);
int mx=-0x3f3f3f3f;
n=10000;
// for(int i=1;i<=n;++i) mx=maxim(i, mx);
//printf("%d\n", mx);
int vv;
long long s=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)s+=sum(i, j);
printf("%lld\n", s);
return 0;
}