比赛 |
20151019 |
评测结果 |
C |
题目名称 |
学数数 |
最终得分 |
0 |
用户昵称 |
mikumikumi |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2015-10-19 22:29:48 |
显示代码纯文本
#include<cstdio>
#include<deque>
#include<cstring>
#include<iostream>
#include<map>
#include<cmath>
using namespace std;
const int SIZEN=100010;
typedef long long LL;
deque<LL> P;
map<LL,int> mp;
int N,Q;
LL a[SIZEN];
int next[SIZEN],be[SIZEN];
int A[SIZEN]={0};
LL tree[SIZEN];
LL sum=0;
class miku
{
public:
LL sum,id;
}s[SIZEN];
int lowbit(int x)
{
return x&(-x);
}
void add(int x,LL now)
{
for(int i=x;i<=N;i+=lowbit(i)) tree[i]+=now;
}
void read()
{
scanf("%d%d",&N,&Q);
for(int i=1;i<=N;i++)
{
scanf("%I64d",&a[i]);
}
P.push_back(1);
be[1]=0;
for(int i=2;i<=N;i++)
{
while(!P.empty()&&a[P.back()]<=a[i]) P.pop_back();
if(!P.empty())
be[i]=P.back();
else be[i]=0;
P.push_back(i);
}
P.clear();
P.push_back(N);
next[N]=N+1;
for(int i=N-1;i>=1;i--)
{
while(!P.empty()&&a[P.back()]<=a[i]) P.pop_back();
if(!P.empty())
next[i]=P.back();
else next[i]=N;
P.push_back(i);
}
}
bool cmp(miku a,miku b)
{
return a.sum<b.sum;
}
void make()
{
for(int i=1;i<=N;i++) s[i].id=i,s[i].sum=a[i];
sort(s+1,s+N+1,cmp);
int cnt=1;
A[s[1].id]=1;
mp[s[1].sum]=cnt;
for(int i=2;i<=N;i++)
{
if(s[i].sum!=s[i-1].sum) cnt++;
mp[s[i].sum]=cnt;
A[s[i].id]=cnt;
}
}
void prepare()
{
make();//离散化
for(int i=1;i<=N;i++)
{
LL now=(i-1-be[i])*(next[i]-i-1);
now+=(i-1-be[i])+(next[i]-i-1);
now++;
sum+=now;
add(i,now);
}
}
LL get(int x)
{
LL ans=0;
for(int i=x;i>0;i-=lowbit(i))
ans+=tree[i];
return ans;
}
void work()
{
char c;
LL m;
for(int i=1;i<=Q;i++)
{
cin>>c;
scanf("%d",&m);
m=mp[m];
LL tem1=get(m-1),tem2=get(m);
LL ans=0;
if(c=='>') ans=sum-tem2;
else if(c=='=') ans=tem2-tem1;
else if(c=='<') ans=tem1;
//cout<<tem1<<" "<<tem2<<endl;
printf("%I64d\n",ans);
}
}
int main()
{
freopen("jxthree.in","r",stdin);
freopen("jxthree.out","w",stdout);
read();
prepare();
work();
return 0;
}