阿斯顿发发顺丰

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=2000000;
int add[maxn],l[maxn],r[maxn],sum[maxn],b[maxn],a[maxn];
int n,m,len,tot,ans;
int cop[maxn];


/*void work(int l,int r,int z)
{
    int mid;
    while(l<=r)
    {    
    mid=(l+r)>>1;
    if(cop[mid]<z)
    {
        l=mid+1;
    }
    else r=mid-1;
    }
    ans+=r-l+1;
}*/



void worki(int x)
{
    for(int i=l[b[x]];i<=r[b[x]];i++)
    {
        cop[i]=a[i];
    }
    sort(cop+l[b[x]],cop+r[b[x]]+1);
}


int main()
{
    scanf("%d%d",&n,&m);
    len=sqrt(n);
    tot=n/len;
    if(n%len) tot++;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        cop[i]=a[i];
        b[i]=(i-1)/len+1;
        //sum[b[i]]+=a[i];
    }
    for(int i=1;i<=tot;i++)
    {
        l[i]=(i-1)*len+1;
        r[i]=i*len;
        //sort(cop+l[i]+1,cop+r[i]+1);
        if(i==tot) r[i]=n;
    }
    
    for(int i=1;i<=tot;i++)
    {
        sort(cop+l[i],cop+r[i]+1);
    }
    for(int j=1;j<=m;j++)
    {
        char s[2];
        int x,y,z;
        scanf("%s",s);
        if(s[0]=='M')
        {
            scanf("%d%d%d",&x,&y,&z);
            
            if(b[x]==b[y])
            {
                for(int i=x;i<=y;i++)
                {
                    a[i]+=z;
                }
                worki(x);
                continue;
            }
            for(int i=x;i<=r[b[x]];i++)
            {
                a[i]+=z;
                //sum[b[i]]+=z;
                //sort(cop+x+1,cop+min(y,r[b[x]]));
            }
            for(int i=y;i>=l[b[y]];i--)
            {
                a[i]+=z;
                //sum[b[i]]+=z;
                //sort(cop+max(x,l[b[y]])+1,cop+y+1);
            }
            worki(x);worki(y);
            for(int i=b[x]+1;i<=b[y]-1;i++)
            {
                add[i]+=z;
            }
        }
        else
        {
            scanf("%d%d%d",&x,&y,&z);
             ans=0;
             
             if(b[x]==b[y])
             {
                 for(int i=x;i<=y;i++)
                 {
                     if(a[i]+add[b[i]]>=z) ans++;
                 }
                 printf("%d\n",ans);
                 continue;
             }
             
             for(int i=x;i<=r[b[x]];i++)
             {
                 if(a[i]+add[b[i]]>=z) ans++;
             }
             
             for(int i=y;j>=l[b[y]];i--)
             {
                 if(a[i]+add[b[i]]>=z) ans++;
             }
            //work(x,min(y,r[b[x]]),z);
            //work(max(x,l[b[y]]),y,z);
            for(int i=b[x]+1;i<=b[y]-1;i++)
            {
                 int d=lower_bound(a+l[i],a+r[i]+1,z-add[i])-a;
                ans+=r[i]-d+1;
                //work(l[i],r[i],z);
            }
            printf("%d\n",ans);
        }
    }
    
    
    return 0;
}
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1000000;
struct node
{
    int l,r,id;
}qu[maxn];
int n,q,a[maxn];
int len,tot,b[maxn];
int cnt[maxn],ll=1,rr=0,now=0;
bool cmp(node x,node y)
{
    if(b[x.l]==b[y.l]) return x.r<y.r;
    else return x.l<y.l;
}
/*int cmp(node x,node y) {
    return (b[x.l] ^ b[y.l]) ? b[x.l] < b[y.l] : ((b[x.l] & 1) ? x.r < y.r : x.r > y.r);
}*/

void add(int pos)
{
    if(!cnt[a[pos]]) ++now;
    ++cnt[a[pos]];
}

void del(int pos)
{
    --cnt[a[pos]];
    if(!cnt[a[pos]]) now--;
}

int ans[maxn];
int main()
{
    scanf("%d",&n);
    len=sqrt(n);
    tot=n/len;
    if(n%len) tot++;
    
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        b[i]=(i-1)/len+1;
    }
    
    scanf("%d",&q);
    for(int i=1;i<=q;i++)
    {
        scanf("%d%d",&qu[i].l,&qu[i].r);
#include<cstdio>
#include<cstring>
#include<cmath> 
#include<algorithm>
using namespace std;
const int maxn=200000;
int n,m;
int a[maxn],l[maxn],r[maxn],b[maxn],sum[maxn];
int len,tot,add[maxn];

int main()
{
    scanf("%d%d",&n,&m);
     len=sqrt(n);//区间长度 
     tot=n/len;//区间个数 
     if(n%len) tot++;
     for(int i=1;i<=n;i++)
     {
         scanf("%d",&a[i]);
         b[i]=(i-1)/len+1;//隶属哪一块 
         sum[b[i]]+=a[i];//区间总和 
     }
     for(int i=1;i<=tot;i++)
     {
         l[i]=(i-1)*len+1;//区间左右端点 
         r[i]=i*len;
     }
     
     for(int i=1;i<=m;i++)
     {
         int q,x,y,k;
         scanf("%d",&q);
         if(q==1)
         {
             scanf("%d%d%d",&x,&y,&k);
             for(int j=x;j<=min(y,r[b[x]]);j++)
             {
                 a[j]+=k;
                 sum[b[j]]+=k;
             }
             for(int j=y;j>=max(x,l[b[y]]);j--)
             {
                 a[j]+=k;
                 sum[b[j]]+=k;
             }
             for(int j=b[x]+1;j<=b[y]-1;j++)
             {
                 add[j]+=k;
             }
         }
         else if(q==2)
         {
             long long ans=0;
             scanf("%d%d",&x,&y);
             for(int j=x;j<=min(y,r[b[x]]);j++)
             {
                 ans+=a[j]+add[b[j]];
             }
             for(int j=y;j>=max(x,l[b[y]]);j--)
             {
                 ans+=a[j]+add[b[j]];
             }
             for(int j=b[x]+1;j<=b[y]-1;j++)
             {
                 ans+=sum[j]+add[j]*(r[j]-l[j]+1);
             }
             if(b[x]==b[y])
             {
                 ans-=a[x]+a[y]+add[b[x]]+add[b[y]];
             }
             printf("%lld\n",ans);
         }
     } 
    
    return 0;
}

 

      qu[i].id=i;
    }
    sort(qu+1,qu+q+1,cmp);
    for(int i=1;i<=q;i++)
    {
        int ql=qu[i].l;
        int qr=qu[i].r;
        while(ll<ql) del(ll++);
        while(ll>ql) add(--ll);
        while(rr>qr) del(rr--);
        while(rr<qr) add(++rr);
        ans[qu[i].id]=now; 
    }
    for(int i=1;i<=q;i++) printf("%d\n",ans[i]);
    return 0;
}

 

posted @ 2019-07-12 21:36  AiRomance  阅读(265)  评论(0编辑  收藏  举报