Cod sursa(job #71289)

Utilizator gigi_becaliGigi Becali gigi_becali Data 9 iulie 2007 23:25:21
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
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;
}