#include <iostream>
#include <cmath>
#include <cstring>
#include <string>
#include <set>
#include <ctime>
#include <queue>
#include <algorithm>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
const int N = 2e5+10;
ll a[N];
int n, q;
struct tree {
int l, r;
ll tag, sum;
}t[N<<2];
int lc(int k) {
return (k << 1);
}
int rc(int k) {
return (k << 1 | 1);
}
inline void push_up(int k) {
t[k].sum = t[lc(k)].sum + t[rc(k)].sum;
}
inline void push_down(int k, int len) {
if(t[k].tag != LLONG_MIN) {
t[lc(k)].tag = t[k].tag;
t[rc(k)].tag = t[k].tag;
t[lc(k)].sum = (len - len / 2) * t[k].tag;
t[rc(k)].sum = (len / 2) * t[k].tag;
t[k].tag = LLONG_MIN;
}
}
inline void buildTree(int k, int l, int r) {
t[k].l = l; t[k].r = r; t[k].sum = 0;
t[k].tag = LLONG_MIN;
if(l == r) {
t[k].sum = a[l];
return;
}
int mid = (l + r) >> 1;
buildTree(lc(k), l, mid);
buildTree(rc(k), mid+1, r);
push_up(k);
}
ll query(int k, int l, int r) {
if(t[k].l >= l && t[k].r <= r) {
return t[k].sum;
}
int mid = (t[k].l + t[k].r) >> 1;
ll res = 0;
push_down(k, (t[k].r - t[k].l + 1));
if(l <= mid)
res += query(lc(k), l, r);
if(r > mid)
res += query(rc(k), l, r);
push_up(k);
return res;
}
inline void update1(int k, int x, int z) {
t[k].sum = t[k].sum - a[x] + z;
if(t[k].l >= x && t[k].r <= x) {
a[x] = z;
return;
}
int mid = (t[k].l + t[k].r) >> 1;
if(x <= mid)
update1(lc(k), x, z);
if(x > mid)
update1(rc(k), x, z);
}
inline void update2(int k, int l, int r, int z) {
if(t[k].l >= l && t[k].r <= r) {
t[k].sum = (t[k].r - t[k].l + 1) * z;
t[k].tag = z;
return;
}
push_down(k, (t[k].r - t[k].l + 1));
int mid = (t[k].l + t[k].r) >> 1;
if(l <= mid)
update2(lc(k), l, r, z);
if(r > mid)
update2(rc(k), l, r, z);
push_up(k);
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n >> q;
for(int i = 1; i <= n; ++i)
cin >> a[i];
buildTree(1, 1, n);
while(q--) {
int p;
cin >> p;
if(p == 1) {
int x, z;
cin >> x >> z;
update2(1,x,x,z);
} else {
int x;
cin >> x;
update2(1,1,n,x);
}
cout << query(1,1,n) << endl;
}
return 0;
}