08:Challenge 1

总时间限制: 10000ms单个测试点时间限制: 1000ms内存限制: 262144kB描述

给一个长为N的数列,有M次操作,每次操作是以下两种之一:

(1)修改数列中的一个数

(2)求数列中某位置在某次操作后的值

输入第一行两个正整数N和M。

第二行N个整数表示这个数列。

接下来M行,每行开头是一个字符,若该字符为'M',则表示一个修改操作,接下来两个整数x和y,表示把x位置的值修改为y;若该字符为'Q',则表示一个询问操作,接下来两个整数x和y,表示求x位置在第y次操作后的值。输出对每一个询问操作单独输出一行,表示答案。样例输入

5 3
1 2 3 4 5
Q 1 0
M 1 3
Q 1 2

样例输出

1
3

提示1<=N<=10^5,1<=M<=10^5,输入保证合法,且所有整数可用带符号32位整型存储。

很多人第一眼看到这道题觉得要用主席树什么的了。

但是。

rope大法好!!。

没什么好解释的,就是个裸地不能再裸地模板题,,,

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<ext/rope>
using namespace std;
using namespace __gnu_cxx;
const int MAXN=2000050;
const int maxn=0x7fffffff;
void read(int &n)
{
    char c='+';int x=0;bool flag=0;
    while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;}
    while(c>='0'&&c<='9'){x=x*10+(c-48);c=getchar();}
    flag==1?n=-x:n=x;
}

rope<int> *rp[MAXN];
int a[MAXN];
int tot=0;
int main()
{
	ios::sync_with_stdio(0);
    int n,m;
    read(n);read(m);
    for(int i=1;i<=n;i++)
    	read(a[i]);
    rp[0]=new rope<int>(a+1,a+n+1);
    for(int i=1;i<=m;i++)
    {
    	rp[i]=new rope<int>(*rp[i-1]);
    	char c=getchar();
		int x,y;
    	if(c=='Q')
    	{
    		int l,r;
    		int ans=0;
    		read(l);read(r);read(x);
    		for(int i=l;i<=r;i++)
    			ans+=(rp[x]->at(i-1));
    		printf("%d\n",ans);
		}
		else
		{
			read(x);read(y);
			rp[i]->replace(x-1,y);
		}
	}
    return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Codeforces Round #473 (Div. 2)

    attack
  • CodeChef March Lunchtime 2018 div2

    地址https://www.codechef.com/LTIME58B?order=desc&sortBy=successful_submissions

    attack
  • 3673: 可持久化并查集 by zky

    Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是...

    attack
  • Codeforces Round #473 (Div. 2)

    attack
  • UOJ#386. 【UNR #3】鸽子固定器(链表)

    如果我们按$s$排序后,我们就可以枚举$max  \ s_i$和$min \ s_i$

    attack
  • CodeChef March Lunchtime 2018 div2

    地址https://www.codechef.com/LTIME58B?order=desc&sortBy=successful_submissions

    attack
  • 3673: 可持久化并查集 by zky

    Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是...

    attack
  • C++和Java中交换两个整数的方法

    在C和C++中交换两个整数有多种方式,我想到的常用方法有以下4种: 1、使用引用传参 2、使用指针传参 3、利用位异或运算符^的特性,并结合引用传参 4...

    ccf19881030
  • Poj 1564 || HDU 1258 Sum It Up(dfs+技巧)

          题意就是先输入n,m,然后输入m个数,问在这m个数里有多少种任意相加起来等于n的方法,并且输出这些相加的数。

    Ch_Zaqdt
  • 2034-人见人爱A-B(c++实现)

    参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法...

    用户2038589

扫码关注云+社区

领取腾讯云代金券