洛谷 P1483 序列变换

题目描述

给定一个由n个整数构成的序列,你需要对它进行如下操作:

操作1:输入格式“1 x y”,表示把所有akx都加上y。

操作2:输入格式“2 j”,表示输出a[j]。

输入输出格式

输入格式:

 

第一行,两个数n,m,表示有n个数,m条操作。

第二行,n个数a[1],a[2],…,a[n]。

接下来m行,为m条操作。

 

输出格式:

 

输出若干行,每行对应一次操作2。

 

输入输出样例

输入样例#1: 复制
5 4
6 9 9 8 1 
2 4
1 2 5
1 3 1
2 4
输出样例#1: 复制
8
13

说明

对于40%的数据,n<=100

对于100%的数据,n<=1000000,m<=100000,|a[i]|<=1000000,|y|<=1000000,x<=n,j<=n,操作2不超过10000条。

思路:一开始一看以为是一个线段树,后来才发现,是一个模拟就可以过去的题目。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 1000010
using namespace std;
int n,m;
long long num[MAXN],bns[MAXN];
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)    scanf("%lld",&num[i]);
    for(int i=1;i<=m;i++){
        int pos;int x,y;
        scanf("%d%d",&pos,&x);
        if(pos==1){
            scanf("%d",&y);
            bns[x]+=1ll*y;
        }
        else if(pos==2){
            long long ans=num[x];
            for(int j=1;j*j<=x;j++)
                if(x%j==0){
                    if(j*j!=x)    ans+=bns[j]+bns[x/j];
                    else    ans+=bns[j];
                }
            cout<<ans<<endl;
        }
    }
}

 

posted @ 2018-01-07 16:11  一蓑烟雨任生平  阅读(146)  评论(0编辑  收藏  举报